2016-07-08 6 views
0

いいえこれは私の初めての投稿です。入力しようとすると、このような要素の例外はありません

長方形を作成する別のクラスを使用してボックスを作成しようとしています。しかし、実行しようとすると、高さと幅の値を入力するようになりますが、深度を入力しようとすると直ぐに、このエラーがポップアップします。

ご協力いただきありがとうございます。

コンソール:

Ange rektangelns bredd: 
10 
Ange rektangelns höjd: 
10 
En rektangelns med bredden 10 och höjden 10 ger arean 100 
Ange rektangelns djup: 
Exception in thread "main" java.util.NoSuchElementException 
at java.util.Scanner.throwFor(Scanner.java:862) 
at java.util.Scanner.next(Scanner.java:1371) 
at cj222qu.Box.<init>(Box.java:18) 
at cj222qu.Steg4_lab02.main(Steg4_lab02.java:7) 

Boxクラス:

import java.util.Scanner; 

public class Box extends Rectangle { 

private int depth; 

public Box() { 
    Scanner hej = new Scanner(System.in); 

    String dep = null; 
    boolean go3 = true; 

    while (go3) { 
     try { 
      System.out.println("Ange rektangelns djup: "); 
      dep = hej.next(); 
      Integer.parseInt(dep); 
      go3 = false; 
     } catch (NumberFormatException e) { 
      System.out.println("Ett fel har inträffat! Ange värdet som ett tal"); 
      go3 = true; 
     } 
    } 

    //new Box(getWidth(), getHeight(), Integer.parseInt(dep)); 

    hej.close(); 
} 

public Box(int width, int height, int depth) { 

    setDepth(depth); 

    System.out.println(toString()); 
} 

public String toString() { 
    StringBuilder result = new StringBuilder(); 

    result.append("En låda med bredden " + getWidth() + ", höjden " + getHeight() + " och djupet " + "."); 
    result.append("Lådans volym är " + computeVolume() + "."); 
    result.append("Lådans mantelarea är " + computeArea() + "."); 
    return result.toString(); 
} 

public int computeVolume() { 
    int volume = 0; 

    volume = getWidth() * getHeight() * getDepth(); 

    return volume; 
} 

public int computeArea() { 
    int mantelarea = 0; 

    mantelarea = getDepth() * getWidth() * 2 + getDepth() * getHeight() * 2 + getWidth() * getHeight() * 2; 

    return mantelarea; 
} 

public int getDepth() 
{ 
    return depth; 
} 

public void setDepth(int d) 
{ 
    depth = d; 
} 
} 

Rectangleクラス:

import java.util.Scanner; 

public class Rectangle { 


private int height; 
private int width; 

public Rectangle(int width, int height) 
{ 
    setHeight(height); 
    setWidth(width); 

    System.out.println(toString()); 
} 



@Override 
public String toString() { 
    StringBuilder result = new StringBuilder(); 

    result.append("En rektangelns med bredden " + width + " och höjden " + height + " ger arean " + computeArea()); 
    return result.toString(); 
} 



public Rectangle() 
{ 
    Scanner keyboard = new Scanner(System.in); 


    String w = null; 
    String h = null; 
    boolean go1 = true; 
    boolean go2 = true; 

    while (go1) { 
     try { 
      System.out.println("Ange rektangelns bredd: "); 
      w = keyboard.next(); 
      Integer.parseInt(w); 
      go1 = false; 
     } catch (NumberFormatException e) { 
      System.out.println("Ett fel har inträffat! Ange värdet som ett tal"); 
      go1 = true; 
     } 

    } 

    while (go2) { 
     try { 
      System.out.println("Ange rektangelns höjd: "); 
      h = keyboard.next(); 
      Integer.parseInt(h); 
      go2 = false; 
     } catch (NumberFormatException e) { 
       System.out.println("Ett fel har inträffat! Ange värdet som ett tal"); 
       go2 = true; 
     } 
    } 

    new Rectangle(Integer.parseInt(w), Integer.parseInt(h)); 


    keyboard.close(); 
} 

public int computeArea() 
{ 
    int area = 0; 

    area = getHeight() * getWidth(); 

    return area; 
} 

public int getHeight() 
{ 
    return height; 
} 

public int getWidth() 
{ 
    return width; 
} 

public void setHeight(int h) 
{ 
    height = h; 
} 

public void setWidth(int w) 
{ 
    width = w; 
} 
} 

メイン:

public class Steg4_lab02 { 

public static void main(String[] args) { 

    new Box(); 

} 

} 
+0

「スキャナ」が終了していない場合は閉じないでください。 –

+0

次に質問をするときに、より説明変数の名前があり、出力文字列が英語であることをお勧めします。人々があなたを助けるのを助けるべきです。これは、一般的にコード化するより良い方法です。出力文字列に別の言語を使用したい場合は、英語で始めて最初のパブリックバージョンの直前に変更することをお勧めします。 –

+0

コンストラクタでユーザ入力を収集するのは悪い考えです。 – Fildor

答えて

1

あなたがSystem.inで複数Scannersをインスタンス化してはならない、それが閉じるように大きなノーノーをだScannerSystem.in(基本的にはSTDINストリームをクローズ)し、その後System.inで新しいScannerを作成してインスタンス化。

Rectangleには、Scannerのコンストラクタ、または幅と高さを持つコンストラクタが必要です。次に、Scannerで渡されたユーザー入力を収集するか、ユーザー入力をmain()に収集し、ユーザーから収集された幅と高さでRectangleを作成します。

コメントにFildorが記載したように、BoxRectangleクラスは、ユーザーの入力を収集する責任を負うべきではありません。

+0

実際には、入力から値を収集するのは、RectangleやBoxクラスの責任ではありません。 – Fildor

+0

@Fildor全部一致します。 –

関連する問題