2016-09-16 2 views
-1

非常に限られた知識でJavaを使用して非常に単純なコンソール計算機を作成しました。プログラム実行中にNullPointerExceptionがスローされるJava

プログラムは、2つの数字だけで基本的な数学関数(+、 - 、*、/)を実行する必要があります。プログラムは最初にinpmodeoutmodeの2つの値を求めます。 inpmodeは、ユーザーが2つの数字を入力するモードです(2つのモードは、10進数入力の場合は「dec」、2進入力の場合は「bin」です)。この情報(inpmodeおよびoutmode)は、テキストファイルに書き込まれ、どこかに格納され、その後、プログラムは値を求めて結果を表示します。結果を表示した後、ユーザーには、終了するには、同じモードで作業を続ける、モードを変更する、という3つのオプションがあります。これはユーザーが終了することを選択するまで続きます。

Here's a simple flowchart I made for the purpose.

ここに私が悪いのコードがあります:私は最初の実行後にモードを変更することを選択したときに例外がスローされます

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

class FileTry { 
    Scanner sc=new Scanner(System.in); 
    String inpmode=""; 
    String outmode=""; 
    FileWriter fw; 
    BufferedWriter bw; 
    PrintWriter pw; 
    String n1,n2; 
    FileReader fr; 
    BufferedReader br; 
    String read; 
    String arr[]=new String[2]; 
    int nu2,res,i=0; 
    String op; int nu1=nu2=res=0; 


    void main(){ 
     try { 
      fr=new FileReader("C:\\Users\\dell pc\\Desktop\\tryer.txt"); 
      askdata(); 

     } 

     catch (IOException e) { 
      try 
      { 
       System.out.println("File needs to be created first"); 
       fw=new FileWriter("C:\\Users\\dell pc\\Desktop\\tryer.txt"); 
       bw=new BufferedWriter(fw); 
       pw=new PrintWriter(bw); 
       askuser(); 
      } 
      catch(IOException a){ 
       System.out.println("Error"); 
      } 
     } 

    } 

    void askuser() 
    { 

     System.out.println("Input mode?"); 
     inpmode=sc.nextLine(); 
     System.out.println("Output mode?"); 
     outmode=sc.nextLine(); 
     modewriter(); 
    } 

    void modewriter() 
    { 

     try 
     { 
      pw.println(inpmode); 
      pw.println(outmode); 
      pw.close(); 
      bw.close(); 
      fw.close(); 
     } 

     catch(IOException b) 
     { 
      System.out.println("error"); 

     } 
     askdata(); 
    } 

    void askdata() 
    { 

     System.out.println("Enter num 1"); 
     n1=sc.nextLine(); 
     System.out.println("Enter num 2"); 
     n2=sc.nextLine(); 
     System.out.println("Enter the operation"); 
     op=sc.nextLine(); 
     reader(); 
    } 

    void reader() 
    { 

     int i=0; 
     try 
     { 
      Scanner fileScanner=new Scanner(new File("C:\\Users\\dell pc\\Desktop\\tryer.txt")); 
      while (fileScanner.hasNextLine()){ 
       arr[i]=fileScanner.nextLine(); 
       i++; 
      } 

     } 

     catch (IOException x) 
     { 
      System.out.println("errer"); 
     } 

     caller(); 
    } 

    void caller(){ 

     if (arr[0].equals("bin")&&arr[1].equals("bin")) 
     { 
      todec(); 
      operate(); 
      tobin(); 
      print(); 
     } 

     else if(arr[0].equals("bin")&&arr[1].equals("dec")) 
     { 
      todec(); 
      operate(); 
      print(); 
     } 

     else if(arr[0].equals("dec")&&arr[1].equals("dec")) 
     { 
      nu1=Integer.parseInt(n1); 
      nu2=Integer.parseInt(n2); 
      operate(); 
      print(); 
     } 
     else if(arr[0].equals("dec")&&arr[1].equals("bin")) 
     { 
      nu1=Integer.parseInt(n1); 
      nu2=Integer.parseInt(n2); 
      operate(); 
      tobin(); 
      print(); 
     } 
     else System.out.println("kk"); 
    } 

    void todec() 
    { 

     int decimal = 0; 
     int power = 0; 
     int binary=Integer.parseInt(n1); 
     while(true){ 
      if(binary == 0){ 
       break; 
      } else { 
       int tmp = binary%10; 
       decimal += tmp*Math.pow(2, power); 
       binary = binary/10; 
       power++; 
      } 
     } 
     nu1=decimal; 
     decimal = 0; 
     power = 0; 
     binary=Integer.parseInt(n2); 
     while(true){ 
      if(binary == 0){ 
       break; 
      } else { 
       int tmp = binary%10; 
       decimal += tmp*Math.pow(2, power); 
       binary = binary/10; 
       power++; 
      } 
     } 
     nu2=decimal; 


     System.out.println(nu1+" "+nu2); 
    } 

    void operate() 
    { 

     switch(op.charAt(0)) 
     { 
     case '+' : 
     { res=nu1+nu2; 
     break;} 
     case '-': 
     { res=nu1-nu2; 
     break;} 
     case '/': 
     { res=nu1/nu2; 
     break;} 
     case '*': 
     { res=nu1*nu2; 
     break;} 
     default: 
      System.out.println("Errorr"); 
     } 
    } 

    void tobin() 
    { 

     String temp=""; 
     i=res; 
     while(i>0) 
     { 
      temp=(i%2)+temp; 
      i=i/2; 
     } 
     temp=i+temp; 
     res=Integer.parseInt(temp); 
    } 

    void print() 
    { 

     System.out.println(res); 
     System.out.println("n for another operation"); 
     System.out.println("m to change the modes"); 
     System.out.println("e to exit"); 
     char c=sc.nextLine().charAt(0); 
     switch (c) 
     { 
     case 'n' : 
     { 
      askdata(); 
      break; 
     } 

     case 'm' : 
     { 
      askuser(); 
      break; 
     } 

     case 'e' : 
     { 
      System.out.println("Bye"); 
      break; 
     } 

     default: System.out.println("errreeer"); 
     } 

    } 
} 

ので、誰かが私はこの問題を解決する助けてくださいことができますか?

編集:私の質問については、this one.の複製であることがわかります。それはどういうものか分かりません。私はこの質問の間に私が得ているエラーを説明している間、ここにプログラムの間に立ち往生しています。私は、コードを動作させるための解決法または可能な提案が必要です。

+5

[NullPointerExceptionとは何ですか?それを修正するにはどうすればいいですか?](http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix -it) –

+0

正確なエラーメッセージは何ですか?スタックトレースが必要です。 – marstran

+0

[これは何であるか](https://s6.postimg.org/644j4z8cx/Untitled.png)@marstran – JavaPilgrim

答えて

1

pwが初期化されていないため、askuserメソッド内の58行目でエラーが発生します。

mainメソッドでIOExceptionが発生した場合にのみ、pwが初期化されます。ただし、例外が発生しない場合は、とにかくprintメソッドを通じてaskuserメソッドにアクセスすることができます。この時点でpwは初期化されていないため、NullPointerExceptionが発生します。

mainメソッドでもエラーを修正するには、pwbwをエラーのない場合でも初期化してください。

-1

あなたはそれをキャッチしようとしましたか?

try { /* code part that throws exception */ } catch (NullPointerException e) { e.printStackTrace();} 

StackTraceは、ヌル値を指している場所とその理由を示す非常に貴重な情報を提供します。

+0

それを調べていただきありがとうございます。私は上記のtry-catchを追加しましたが、porgramは現在コンパイルされていません。私には「void型はここで許可されていません」というエラーが返されます。 – JavaPilgrim

+0

void mainの前に "static"がありません - 1つの主な機能がJavaプログラムで許可されています。 'public static void main(String [] args){'は必要なヘッダです。 – Gewure

0

fw=new FileWriter("lol.txt"); bw=new BufferedWriter(fw) pw=new PrintWriter(bw);

あなたは、try-catch文にこれを入れています。つまり、エラーが表示されない限り、PrintWriter pwは初期化されません。後でpw.println(inpmode);と呼ぶpwが初期化されていないので、nullpointerexceptionが発生します。

関連する問題