私はクラスのために書いたプログラムをテストしている最中に、Javaクラスを開始してエラーのように見えます。私は宿題を手伝ってもらう必要はありません。ヌルについての2つのこと、およびヌルの解析に関する1つのことを理解したいと思います。intとdoubleの解析間でNullExceptionHandlingが異なる
最初に、サンプルコードを実行すると、スイング入力ボックスの入力なしで[OK]ボタンをクリックすると、nullと思われる文字列値が格納されることがわかります。しかし、文字列がテストされたときにはnullとしてテストされません。どうしてこれなの?
第2に、サンプルコードを実行すると、スイング入力ボックスの[キャンセル]ボタンをクリックすると、テキスト「null」を含む文字列のように見える値が格納されることがわかります。これはnull値としてテストしますが、テキスト "null"を含む文字列は明らかにnullとしてテストされません。ヌル文字列値が ""であると思ったときにキャンセルボタンがテキスト "null"を含む文字列を生成するのはなぜですか?
最後に、サンプルコードを実行すると、nullとしてテストされた値がdoubleとして解析されたときにNullPointerExceptionをスローするが、intとして解析されたときにNullPointerExceptionをスローしないことがわかります。どうしてこれなの?
私の先生はこれらの質問に答えることができませんでした。彼は、サンプルプログラムの構文解析が算術的に達成されたと考えていたので、intは小数点を扱わないため動作が異なる可能性があります。それは私にはいくらか意味がありますが、そうであれば、Stringのようなnullで解析する理由は何でしょうか?キャンセルボタンによって生成されたnull?
私のサンプルコードは以下の通りです:
まずimport javax.swing.*;
public class NullTest {
public static void main(String[] args) {
//Demonstrate behavior with doubles.
throwingDoubles();
//Demonstrate behavior with integers.
throwingInts();
}
public static void throwingDoubles()
{
//Loops three times so you can test each option.
for (int i = 0; i < 3; i++)
{
JOptionPane.showMessageDialog(null, "Double Tester\nFirst time through click ok without entering text.\nSecond time through click cancel.\nFinally type in null to prove that this string is not treated as a null value.");
String answer = JOptionPane.showInputDialog(null, "I would think 'answer' would be null if you click ok without entering anything.");
JOptionPane.showMessageDialog(null, "Double Tester\n'" + answer + "'\nIt appears null here if you don't enter anything, but as a string if you click cancel");
if (answer==null)
{
JOptionPane.showMessageDialog(null, "Double Tester\nTested null");
JOptionPane.showMessageDialog(null, "Double Tester\n'" + answer + "'\nIt appears the same here.");
}
else
{
JOptionPane.showMessageDialog(null, "Double Tester\nDid not test null");
JOptionPane.showMessageDialog(null, "Double Tester\n'" + answer + "'\nIt appears the same here.");
}
try
{
double varDoub = Double.parseDouble(answer);
}
catch(NumberFormatException e)
{
JOptionPane.showMessageDialog(null, "Double Tester\nThis threw a NumberFormatException");
}
catch(NullPointerException e)
{
JOptionPane.showMessageDialog(null, "Double Tester\nThis threw a NullPointerException");
}
//An early escape clause.
if (JOptionPane.showConfirmDialog(null, "Run the loop again?")!=JOptionPane.OK_OPTION)
{
break;
}
}
}
public static void throwingInts()
{
//Loops three times so you can test each option.
for (int i = 0; i < 3; i++)
{
JOptionPane.showMessageDialog(null, "Int Tester\nFirst time through click ok without entering text.\nSecond time through click cancel.\nFinally type in null to prove that this string is not treated as a null value.");
String answer = JOptionPane.showInputDialog(null, "Int Tester\nI would think 'answer' would be null if you click ok without entering anything.");
JOptionPane.showMessageDialog(null, "Int Tester\n'" + answer + "'\nIt appears null here if you don't enter anything, but as a string if you click cancel");
if (answer==null)
{
JOptionPane.showMessageDialog(null, "Int Tester\nTested null");
JOptionPane.showMessageDialog(null, "Int Tester\n'" + answer + "'\nIt appears the same here.");
}
else
{
JOptionPane.showMessageDialog(null, "Int Tester\nDid not test null");
JOptionPane.showMessageDialog(null, "Int Tester\n'" + answer + "'\nIt appears the same here.");
}
try
{
int varDoub = Integer.parseInt(answer);
}
catch(NumberFormatException e)
{
JOptionPane.showMessageDialog(null, "Int Tester\nThis threw a NumberFormatException");
}
catch(NullPointerException e)
{
JOptionPane.showMessageDialog(null, "Int Tester\nWe never see this code. Why not?");
}
//An early escape clause.
if (JOptionPane.showConfirmDialog(null, "Run the loop again?")!=JOptionPane.OK_OPTION)
{
break;
}
}
}
}
'Double.parseDouble'は' String'の 'trim()'関数を使用している 'FloatingDecimal.readJavaFormatString'を呼び出しています。つまり、ヌル文字列を渡すと、NPEが得られます。 [Double](http://www.docjar.com/html/api/java/lang/Double.java.html)、[FloatingDecimal](http://www.docjar.com/html/api/sun/misc /FloatingDecimal.java.html) – Deco
ありがとうございました。私は空の文字列がnull文字列であると考え、それゆえにnull値だと考えました。 Javaは多くの点でC#と非常によく似ているので、このコンセプトはC#に転送されますか? – Erik
@ErikBollinger:それは大部分ですが、空の文字列への参照とはまったく同じではありません。空の文字列は、文字を持たない通常の文字列です。長さなどを問い合わせることができます。 –