弁財天

ゴフマン「専門家を信じるのではなく、自分自身で考えて判断せよ」

java.lang.NumberFormatException: For input string: "1.0000"

java.lang.NumberFormatException: For input string: "1.0000"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
	at java.lang.Long.parseLong(Long.java:403)
	at java.lang.Long.parseLong(Long.java:452)
	at hoge.HogeBean.addBukken(HogeBean.java:3247)

3246     // 数量
3247     b2HogeInfo.setSuryo(Long.parseLong(argVector.get(intSuryoNo).toString()) - argSuryo);
なんていうふつうのコードで落ちてる。

CREATE TABLE T_HOGE (
…
SURYO NUMBER(12, 4),
…
)

NUMBER(12, 4)の型のカラムなので1.0000の文字列をLong.parseLongしたので java.lang.NumberFormatExceptionになった。
つまらないアプリのエラーであーる。

しかし、どうもこのシステムは問題なく動作してる。

JDBC - Sample, Example Code
テストプログラムを書いて検証開始。

//STEP 1. Import required packages
import java.util.Properties;
import java.sql.*;

public class simpleJdbcSelect {
   // JDBC driver name and database URL
   //static final String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver";  
   static final String JDBC_DRIVER = "weblogic.jdbc.oracle.OracleDriver";  
   //static final String DB_URL = "jdbc:oracle:thin:@localhost:1521:hoge";
   static final String DB_URL = "jdbc:bea:oracle://localhost:1521";
   static final Properties prop = new Properties();

   //  Database credentials
   static final String USER = "hoge";
   static final String PASS = "hoge";
   
   public static void main(String[] args) {
   Connection conn = null;
   Statement stmt = null;
   try{
      //STEP 2: Register JDBC driver
      Class.forName("weblogic.jdbc.oracle.OracleDriver");

      //STEP 3: Open a connection
      System.out.println("Connecting to a selected database...");
      prop.put("sid", "hoge");
      prop.put("servername", "localhost");
      prop.put("user", "hoge");
      prop.put("password", "hoge");
      prop.put("portnumber", "1521");
      //conn = DriverManager.getConnection(DB_URL, USER, PASS);
      conn = DriverManager.getConnection(DB_URL, prop);
      System.out.println("Connected database successfully...");
      
      //STEP 4: Execute a query
      System.out.println("Creating statement...");
      stmt = conn.createStatement();

      //String sql = "SELECT id, first, last, age FROM Registration";
      String sql = "select suryo from T_HOGE WHERE HOGECD = '01'";
      ResultSet rs = stmt.executeQuery(sql);
      //STEP 5: Extract data from result set
      while(rs.next()){
         //Retrieve by column name
         String suryo = rs.getString("suryo");

         //Display values
         System.out.println("suryo:" + suryo);
      }
      rs.close();
   }catch(SQLException se){
      //Handle errors for JDBC
      se.printStackTrace();
   }catch(Exception e){
      //Handle errors for Class.forName
      e.printStackTrace();
   }finally{
      //finally block used to close resources
      try{
         if(stmt!=null)
            conn.close();
      }catch(SQLException se){
      }// do nothing
      try{
         if(conn!=null)
            conn.close();
      }catch(SQLException se){
         se.printStackTrace();
      }//end finally try
   }//end try
   System.out.println("Goodbye!");
}//end main
}//end JDBCExample

static final String JDBC_DRIVER = "weblogic.jdbc.oracle.OracleDriver";

$ java simpleJdbcSelect
Connecting to a selected database...
Connected database successfully...
Creating statement...
suryo:1.0000
Goodbye!
$

static final String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver";

$ java simpleJdbcSelect
Connecting to a selected database...
Connected database successfully...
Creating statement...
suryo:1
Goodbye!
$

SURYO NUMBER(12, 4)のカラムに1が入っていたのでWeblogic8.1SP6付属のJdbcドライバはふつうに"1.0000"を文字列として返した。
しかし9iR2付属のドライバ($ORACLE_HOME/jdbc/lib/ojdbc14.jar)は"1"を返すのでエラーにならなかった。
つまりWebLogic8.1SP6付属のjdbcドライバは精度がいいのでバグが顕在化したのだ。

コネクションプールの定義を

    <JDBCConnectionPool CapacityIncrement="5"
        DriverName="weblogic.jdbc.oracle.OracleDriver"
        InitialCapacity="20" MaxCapacity="55" Name="HogeConnectionPool"
        PasswordEncrypted="{3DES}xxxxxxxxxxx="
        Properties="sid=hoge;servername=localhost;user=hoge;portnumber=1521"
        Targets="hogeserver" TestConnectionsOnReserve="true"
        TestTableName="SQL SELECT 1 FROM DUAL" URL="jdbc:bea:oracle://localhost:1521">
から
    <JDBCConnectionPool DriverName="oracle.jdbc.driver.OracleDriver"
        InitialCapacity="20" MaxCapacity="55" Name="HogeConnectionPool"
        PasswordEncrypted="{3DES}xxxxxxxxxxx=" Properties="user=hoge"
        Targets="hogeserver" TestConnectionsOnReserve="true"
        TestTableName="DUAL" URL="jdbc:oracle:thin:@localhost:1521:hoge"/>
に変更。

投稿されたコメント:

コメント
コメントは無効になっています。