2014-01-28 2 views
0

Вот мой код после изменений, предложенных членами stackoverflow. Код компилируется без ошибок, но когда я запускаю «java Realtor11», я получаю следующие ошибки. Я импортирую правильные библиотеки, поэтому не знаю, в чем проблема.java-программа компилируется без ошибок, но не запускается

Цель программы - прочитать два значения (первая строка - строка (John), а вторая строка - двойная (100)) и выводить их с некоторыми вычислениями в сообщение JOption.

Exception in thread "main" java.lang.NullPointerException at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source) at java.lang.Double.parseDouble(Unknown Source) at Realtor11.main(Realtor11.java:49)

// java class for keyboard I/O 
import java.util.Scanner; 
// java class for JOption GUI 
import javax.swing.JOptionPane; 
// File reader 
import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.io.InputStream; 

public class Realtor11 
{ 
    public static void main(String[] args) 
    { 
    // Keyboard and file input 
     Scanner console = new Scanner(System.in); 
     Scanner inputStream = null; 
    // price of the house, the cost to sell the house and the commission 
     double price = 0; 
     double cost, commission; 
    // seller's name 
     String seller = "name"; 



// GUI diplay message declaration 
    String display_message = "This program calculates the cost to sell a home\n" 
    + "and the commission paid to an individual sales agent.\n\n" 
    + "The user is asked for the last name of the seller and the\n" 
    + "sales price.\n\n"; 

// Output descriptive messages 
    JOptionPane.showMessageDialog(null, display_message, "Lab 1 Description", JOptionPane.INFORMATION_MESSAGE); 

// Read Realtor11.txt 
    try { 
     BufferedReader in = new BufferedReader(new FileReader("Realtor11.txt")); 
     while (in.read()!= -1); 
     seller = in.readLine(); 
     price = Double.parseDouble(in.readLine()); 
     in.close(); 
     } 

     catch (IOException e) {} 


// calculate the cost and the commission 
    cost = 0.06 * price; 
    commission = 0.015 * price; 
// display the input and results 
    String 
     out1 = String.format("%nThe " + seller + "'s" + " home sold for $%.2f%n", price), 
     out2 = String.format("The cost to sell the home was $%.2f%n", cost), 
     out3 = String.format("The selling or listing agent earned $%.2f%n", commission); 

    JOptionPane.showMessageDialog(null, out1 + out2 + out3, seller + "'s Home Sale", JOptionPane.INFORMATION_MESSAGE); 

// Output to file 
// still writing this. 

} 

}

+0

Что на линии точек об ошибках? – Darkhogg

+1

Время для небольшой отладки. Подумайте об использовании отладчика или посыпьте свой код множеством printlns. –

+0

Just FYI - я явно объявляю переменные «цена» и «продавец», так как я получал ошибки компиляции. Но я предполагаю, что это не имеет значения, поскольку переменные будут обновляться на основе содержимого текстового файла. –

ответ

2

Эти три линии вызывают ошибку:

while (in.read()!= -1);   // this reads until EOF 
    seller = in.readLine();   // this gets a null-pointer since we're behind EOF 
    price = Double.parseDouble(in.readLine()); // same as above, This is the printed error. 

Это должно вероятно быть:

seller = in.readLine(); // first line: seller 
    price = Double.parseDouble(in.readLine()); // second line: price 

Это может быть улучшено:

seller = in.readLine(); // first line: seller 
    String sPrice = in.readLine(); // second line: price 
    if (sPrice != null) 
     price = Double.parseDouble(sPrice); 
+0

Спасибо Axel за инструкцию EOF. Теперь я понимаю, почему значения не будут обрабатываться после первой строки. –

0

Существует разница между ошибками компиляции и ошибок во время выполнения (что это).

попробовать это вместо того, чтобы время цикла

String line = in.readLine(); 
if(line != null) { 
    seller = line; 
} 
line = in.readLine(); 
if(line != null) { 
    price = Double.parseDouble(line); 
} 
in.close(); 
3

Проблема эта линия.

while (in.read()!= -1); 

Это своего рода «вырожденная петля» из-за точки с запятой в конце. Он продолжает читать из файла, пока нет ничего, что можно было бы прочитать. После этого нет значений double для синтаксического анализа.

+0

Истинно, и я исправил это. По-прежнему такая же ошибка. Я работаю над другими комментариями. Я новичок в этом, поэтому буду продолжать исследования. –

+0

Хороший глаз Давид. Я бы этого не узнал. – Marenthyu

+0

Хорошо, как вы это исправили? Как вы теперь обращаетесь к «Double.parseDouble»? Немного сложно отлаживать частично фиксированный код, не видя, что такое исправление. –

1

Посмотрите на этот код:

while (in.read()!= -1); 
seller = in.readLine(); 
price = Double.parseDouble(in.readLine()); 
in.close(); 

Первая строка читает все от читателя, ничего не делая с тем, что он читает. Затем, когда все прочитано, вы снова пытаетесь прочитать строку. Это, очевидно, вернет null, так как вы уже все прочитали. И затем вы снова пытаетесь прочитать строку (которая, конечно, продолжает возвращать значение null), и проанализируйте этот null до double.

И в конце вы закрываете устройство чтения, но поскольку вы не делаете этого в блоке finally, NPE, который бросается перед тем, чтобы предотвратить его закрытие.

Я думаю, вам пора прочитать javadoc методов, которые вы используете, и учебник по Java IO.

Кроме того, избежать этого, как от чумы:

catch (IOException e) {} 

Вы просто скрывается исключение из себя, что делает любой диагностики невозможно, если возникает IOException.

+0

Буду честным. Я даже не исследовал «часть исключения». Я сосредоточился на верхней части захвата значений из файла ext. В будущем я буду помнить об этом. –

Смежные вопросы