0

これは、スフィアのオンライン ジャッジパリン問題に対する私の解決策です。Netbeans では正常に動作しますが、裁判官は私の回答を却下し、RuntimeError が発生すると言っています。JCreatorで試したところ、次のように表示されました。

Exception in thread "main" java.lang.NumberFormatException: For input string: ""
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
    at java.lang.Integer.parseInt(Integer.java:468)
    at java.lang.Integer.parseInt(Integer.java:497)
    at Main.main(Main.java:73)

解析するために空の文字列を渡していないのはなぜですか?

コード:

import java.io.*;
import java.util.*;



class Main {

    public static int firstPalinLargerThanNum(int num){

        int foundPalin =0;

        int evalThisNum = ++num;

        while (true){


        if (isPalin(evalThisNum))


            break;

        evalThisNum++;
        }

        foundPalin = evalThisNum;
        return foundPalin;

    }

    public static boolean isPalin(int evalThisNum){

           boolean isItPalin = false;

           int dig=0;
           int rev=0;


          int  n = evalThisNum;

          while (evalThisNum > 0)
          {

           dig = evalThisNum % 10;
           rev = rev * 10 + dig;
           evalThisNum = evalThisNum / 10;

          }

           if (n == rev) {

               isItPalin=true;
           }

           return isItPalin;

    }


    public static void main(String args[]) throws java.lang.Exception{

        BufferedReader r1 = new BufferedReader(new InputStreamReader(System.in));

        /*BufferedReader r1 = new BufferedReader (new FileReader(new File ("C:\\Documents and Settings\\Administrator\\My Documents\\NetBeansProjects\\Sphere\\src\\sphere\\sphere\\PALIN_INPUT.txt")));*/

        String read = r1.readLine();

        int numberOfTestCases = Integer.parseInt(read);

        for (int i=0; i<numberOfTestCases;i++){

        read = r1.readLine();

        if (read!=null){

        int num = Integer.parseInt(read);

        System.out.println(firstPalinLargerThanNum(num));

        }
        }
    }


}

入力:

2
808
2133

73行目は次のとおりです。 int num = Integer.parseInt(read);

4

4 に答える 4

1

<Enter>プログラムが数値を期待しているときに ヒットすると、そのエラーが発生します。

入力が

2
3 
<Enter>

ルーチンに2回繰り返すように指示したため、番号3を処理した後に指定したエラーが表示されます。

余談ですが、数値解析に関するエラー処理に加えtrim()て、readLine()メソッド呼び出しにを導入することもできます。

String read = r1.readLine().trim();

これにより、ユーザーが数字の前後に空白を入れた場合に、入力を適切に処理できるようになります。

于 2009-07-24T21:01:51.433 に答える
1

ただの大げさな推測:行末区切り文字が異なると問題が発生する可能性があります。たとえば、プログラムが実際に取得2<CR><LF>808<CR><LF>2133<CR><LF>し、行がで終了すると考えて、行<CR>を処理します。

次の行を処理しようとすると<LF>、空の文字列を読み取ったと思わせる行が見つかります。

于 2009-08-23T19:24:45.523 に答える
0

ユーザーがプログラムの使用方法を知っていて、正しい入力を提供するとは限りません。裁判官はおそらく、数字を入力せずにEnterキーを押します。彼/彼女はあなたのプログラムが必要とする入力をどのように知ることになっていますか?プログラムは、不可解なエラーでユーザーの顔を爆破するのではなく、正常に失敗する必要があります。

ユーザーが何をすべきかを理解できるように、次のようなことを行う必要があります。

プライベート静的関数readInt(BufferedReader reader)はIOExceptionをスローします
{{
    boolean done = false;
    int result = -1;
    while(!done){
       System.out.print( "整数を入力してください:");
       文字列str=reader.readLine();
       試す{
          結果=Integer.parseInt(str);
          完了=true;
       } catch(NumberFormatException cantconvert){
          System.out.println( "これは整数ではありません。再試行してください。");
       }
    }
    結果を返します。
}

さらに、main関数で例外指定子を使用しないでください(つまり、「main」のシグニチャで「throws」を使用しないでください)。これらのIOExceptionを処理し、例外を修正または解消するためにできることは何もない場合でも、ユーザーにわかりやすくわかりやすいメッセージを出力する必要があります。

于 2009-07-24T21:03:02.650 に答える
0

サンプルコードを Eclipse 3.4 でエラーなしで実行しました。指定された数のテストケースを提供しなかった場合にのみ、同様のエラーを引き起こすことができまし

6
56
87
[Enter]

したがって、このエラーは入力行が不十分な場合にのみ生成されるため、どこかでakf余分なことが起こっているに違いないことに同意する傾向があります。Enter

于 2009-07-24T21:13:34.483 に答える