2016-03-28 3 views
0

Ich versuche, den Wert aus Fiction-Code, der die Kinder von Buch und Buch ist, auch eine andere Kinder Non-Fiction zu verwenden. Unten ist was ich bisher habe. Ich muss etwas von Kindern in der bookTest-Datei verwenden.Greifen Sie auf Daten von Kindern zu und verwenden Sie sie in der übergeordneten Testklasse.

public class Fiction extends Book 
{ 
private String fictionCode; 
private boolean signedByAuthor; 

public boolean isSignedByAuthor() 
{ 
    return signedByAuthor; 
} 

public void setSignedByAuthor(boolean signedByAuthor) 
{ 
    if (signedByAuthor == true) 
    { 
     this.signedByAuthor = signedByAuthor; 
    } 
    else 
    { 
     return; 
     } 
} 

public Fiction() 
{ 
    super(); 
    setFictionCode(""); 
} 

public Fiction(String title, String author, String isbn, Publisher publisher, double price, String fictionCode, int quantity,Date datePublished) 
{ 
super(title, author,isbn, publisher, price, quantity,datePublished); 
setFictionCode(fictionCode); 
} 

public void setFictionCode(String fc) 

{ 
    fictionCode = fc; 
} 

public String getFictionCode() 

{ 
    return fictionCode; 
} 


public double calculateCharge() 
{ 
    double charge = this.getPrice(); 
    if (signedByAuthor == true) 
    { 
     charge = this.getPrice()+ 20 ; 
    } 
    else 
    { 
     return charge; 
    } 

    return charge; 

} 


public String toString() 

{ 
return(super.toString() + " Fiction Code " + fictionCode); 
} 


public String printInvoice() 
{ 
    return null; 
} 

} 

Buchprüfung. Ich habe ein Problem hier, die Schleife nicht durchläuft und ich denke, das Problem ist hier, aber IDK, wie zu beheben.

Fiction f = (Fiction) book; 

if(f.isSignedByAuthor()) 

BookTest java

import java.io.*; 
import java.io.FileNotFoundException; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Formatter; 
    import java.util.Scanner; 

import javax.swing.JOptionPane; 

public class BookTest 
{ 

private static final Fiction Book = null; 


public static void main (String[] args) 
{ 

ArrayList <Book>list = createInstances(); 

writeFile(list); 
} 


public static ArrayList<Book> createInstances() 
{ 
ArrayList<Book> bookArray = new ArrayList<Book>(); 
String inputArray[] = new String [10]; 
int i = 0; 
Scanner input; 
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); 

// Read the text file and stores into inputArray where each line is stored as String. 
try 
{ 
    input = new Scanner(new File("book.txt")); 
    input.useDelimiter("\n"); 
    while (input.hasNext()){ 
     inputArray[i]=input.next(); 
     i++; 
    } 

    // dataArray defines the two dimensional array that store all the values in the line. 
    String dataArray [] [] = new String [10] [11]; 

    for (int k =0; k<inputArray.length; k++) 
    { 
     String getLine = inputArray[k]; 
     String[] eachLine =getLine.split(" "); 
     int length = eachLine.length; 


    for (int j=0; j<length;j++) 
      { 
      dataArray [k][j]= eachLine[j]; 
     } 
    } 

    for (int l = 0; l < 10; l++) 

     { 
      if (dataArray[l][0].equals("Fiction")) 


      { 
       Publisher p = new Publisher(dataArray[l][3], dataArray[l][4]); 

       String[] dateSplit = (dataArray[l][10]).split("/"); // splits the date (eg. 01/1/2015 to array containg 01, 1, 2015 
       Date date = new Date(Integer.parseInt(dateSplit[0]), Integer.parseInt(dateSplit[1]),Integer.parseInt(dateSplit[2])); 

       bookArray.add(new Fiction(dataArray[l][1], dataArray[l][2], dataArray[l][5], 
       p, Double.parseDouble(dataArray[l][6]), dataArray[l][7], l, date)); 
      } 

      else 
      { NonFiction.CategoryCode categoryCode = NonFiction.CategoryCode.valueOf(dataArray[l][7]); 
       Publisher p = new Publisher(dataArray[l][3], dataArray[l][4]); 
       String[] dateSplit = (dataArray[l][9]).split("/"); 
       Date date = new Date(Integer.parseInt(dateSplit[0]), Integer.parseInt(dateSplit[1]),Integer.parseInt(dateSplit[2])); 
       bookArray.add(new NonFiction(dataArray[l][1], dataArray[l][2],dataArray[l][5], 
       p, Double.parseDouble(dataArray[l][6]), categoryCode, l,date)); 
      } 
     } 

} 

catch (FileNotFoundException e) 
{ 

    e.printStackTrace(); 
} 
return bookArray; 
} 


public static void writeFile(ArrayList<Book> arrayOfBook) 
{ 
Formatter output ; 

try 
{ 
    output = new Formatter("updatebooks.txt"); 

     for (Book t : arrayOfBook) 
     { 
     output.format("%s %s %s %s %s %s %s %s %s %s \n \n","Title:", t.getTitle(),"  Author:", t.getAuthor(),"  ISBN:", t.getIsbn(),"  Publisher:",t.getPublisher(),"  Price:",t.getPrice()); 
     } 
     output.close(); 
     } catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 



int count = 0;   
String message = ""; 
for (Book book : arrayOfBook) 
{ 
    if(Book instanceof Fiction) 
    { 
    Fiction f = (Fiction) book; 

    if(f.isSignedByAuthor()) 
    { 
     count++; 
    } 
    message += String.format("%s %s \n","p ", f.isSignedByAuthor()); 
    } 

} 

JOptionPane.showMessageDialog(null, "Total Signed Fiction : " + count);;  
System.out.println(count); 


} 
} 
+0

Ich denke, Ihr ArrayOfBook hat sowohl Fiction und NonFiction Objekte. Beide erweitern die Buchklasse. Da Sie versuchen, NonFiction in Fiction-Klasse zu werfen, daher der Fehler. Sie können Cast nicht eingeben, bis diese Klasse erweitert wurde. –

Antwort

1

bitte ebenfalls tun,

irgendwo außerhalb for..loop,

 int count = 0; 

    .... 


    String message = ""; 
    for (Book book : arrayOfBook) 
    { 
     if(book instanceof Fiction){ 
     Fiction f = (Fiction) book; 
      if(f.isSignedByAuthor()){ 
       count++; 
      } 
     message += String.format("%s %s \n","p ", f.isSignedByAuthor()); 
     } 
    } // end of for loop 
    JOptionPane.showMessageDialog(null, "Total Signed Fiction : " + count); 

wenn book Referenz-Variable bezieht sich auf Fiction Objekt dann book instanceof Fiction zurück true, in diesem Fall müssen Sie nur nach unten werfen, so dass ClassCastException richtig abdecken.

, wenn Ihr Array sowohl Objekttyp enthält Non-fiction und Fiction dann dieser instanceof Scheck wird besser helfen über ClassCastException zu steuern.

+0

@vishalgajeramy array enthält sowohl objekt der fiktion und nicht-fiktion, können sie mir bitte zeigen, wie ich verwenden kann, um den wert nur aus dem aus fiktion, die isSignedByAuthor hat abrufen. – jojo

+0

@jojo ich repariere es bereits durch meine Antwort. Bitte folge ihm. füge einfach hinzu, wenn Bedingung (was ich in meinem asnwer erwähnt) in deine for-Schleife. –

+0

danke für die Hilfe es funktioniert, aber ich habe verschiedene Probleme, ich habe meine Konstruktor und Daten wie folgt.private Boolean signedByAuthor; \t \t public boolean isSignedByAuthor() { \t \t \t return signedByAuthor; \t} \t public void setSignedByAuthor (boolean signedByAuthor) \t { \t \t if (signedByAuthor == true) \t \t { \t \t \t this.signedByAuthor = signedByAuthor; \t \t} \t \t sonst \t \t { \t \t \t return; \t \t} Und ich lese die Datei, die im unteren Format ist. Belletristik Frankenstein Shelley Prescott GA 978-0486282114 7.99 321 true 8 5/12/2008 Fiktion Dracula Stoker Addison CA 978-0486411095 5.99 145 false 53 15.8.2005 Vielen Dank – jojo

Verwandte Themen