2011-12-11 22 views
-2

これには2つの大きな問題があります。この最後の最後のコードブロックが私にNullPointerExceptionを与えています。その特定の日付に起こったイベントを検出するたびに*を追加します。NullPointerException配列javaアプレットへの印刷

第2に、カレンダーを1か月後に開始し、適切な日付に開始するように見えることができません...それは非常に迷惑になっています。

import java.awt.*; 
import java.applet.*; 
import java.awt.event.*; 
public class Calendar extends Applet implements ActionListener{ 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 
private Button next, last; 
private Label month,showYear,sun,mon,tue,wed,thu,fri,sat; 
private Label[] allDays= new Label[37]; 
private Label[] eventMarker = new Label[37]; 
private String[] months= {"January","February","March","April","May","June", 
     "July","August","September","October","November","December"}; 
private String[] monthDays = {"31","29","31","30","31","30","31","31","30","31","30","31"}; 
private int current,year,dateHold,stringParse; 
private final int MAX = 1000;//number of events 
//arrays for data input from file 
private int overallIndex = 0; 
private String[] usrMonth= new String[MAX]; 
private String[] usrDay = new String[MAX]; 
private int[] usrYear = new int[MAX]; 
//private int[] usrTime = new int[MAX]; 
private String[] usrInfo = new String[MAX]; 
private TextField[] fields = new TextField[5]; 
private Label[] overFields = new Label[5]; 
private Button addApt ; 


public void init(){ 
    setSize(1050,750); 
    year = 2012; 
    current = 0;//month in array 
    next = new Button("Next"); 
    last = new Button("Last"); 
    month = new Label(months[current]); 
    showYear = new Label("Year 2012"); 

    //day names on calendar 
    sun = new Label("Sunday"); 
    mon = new Label("Monday"); 
    tue = new Label("Tuesday"); 
    wed = new Label("Wednesday"); 
    thu = new Label("Thursday"); 
    fri = new Label("Friday"); 
    sat = new Label("Saturday"); 
    //day numbers on calendar originally for January 2012 
    String num; 
    for(int i = 0; i < 37; i++){ 
     if(i > 30) 
      allDays[i]=new Label(" "); 
     else{ 
     num = "" + (i+1); 
     allDays[i]=new Label(num);} 
    } 

    for(int i = 0; i < 37; i++){ 
     eventMarker[i] = new Label("|:"); 
    } 

    addApt = new Button("Add Appointment"); 
    overFields[0] = new Label("Enter month by number."); 
    overFields[1] = new Label("Enter the number date."); 
    overFields[2] = new Label("Enter the year."); 
    overFields[3] = new Label("Enter any information on appointment."); 
    overFields[4] = new Label("Search appointments for key words here."); 

    for (int i = 0; i < 5; i ++){ 
     fields[i] = new TextField("Dont forget to press Enter.",300); 
    } 


    //GUI add's 

    //buttons 
    add(next); 
    add(last); 
    add(addApt); 
    //labels 
    add(month); 
    add(showYear); 
    add(sun); 
    add(mon); 
    add(tue); 
    add(wed); 
    add(thu); 
    add(fri); 
    add(sat); 
    //text fields and actionListener 
    for(int i = 0; i < 5; i++){ 
     add(overFields[i]); 
     add(fields[i]); 
     fields[i].addActionListener(this); 
    } 

    for(int i = 0; i <37; i++)//Add array 
     add(allDays[i]); 


    //button listeners 
    next.addActionListener(this); 
    last.addActionListener(this); 


}//end of init 

public void paint(Graphics g){ 
    int first = 571; 
    for (int i = 0; i < 6; i++){//Vertical lines 
     g.drawLine(first, 75, first, 600); 
     first += 71; 
    } 




    //day name positions 
    sun.setBounds(510,75,40,10); 
    mon.setBounds(580,75,40,10); 
    tue.setBounds(650,75,40,10); 
    wed.setBounds(710,75,40,10); 
    thu.setBounds(790,75,40,10); 
    fri.setBounds(860,75,40,10); 
    sat.setBounds(930,75,40,10); 

    //day number positions 
    int second; 





    first = 100;//horizontal line start and finish position 
    for (int i = 0; i < 7; i++){//horizontal lines 
     if (i == 0)//indented on first line 
     g.drawLine(525, first, 975, first); 
     else 
      g.drawLine(500, first, 1000, first); 

     first += 100; 
    } 

    for(int i = 0; i < 37; i++){//adding labels event marker 
     add(eventMarker[i]); 
    } 



    first = 510;//position for event marker 
    second = 125;//diddo 
    for(int i = 0; i < 37; i++){//set position event marker 
     for(int j = 0; j < 7; j++){//inner loop for a per week 
      if((i+j) >= 37)//if index finishes, but loop still has days in week that would call out of bounds 
       continue; 
      eventMarker[i+j].setBounds(first,second,10,10);//added index's for specific day of week 
      first+=71; 

     } 
     i+= 6; 
     first = 510; 
     second += 100; 
    } 

    last.setBounds(505,31,88,30); 
    next.setBounds(895,31,88,30); 
    month.setBounds(730,31,100,30); 
    showYear.setBounds(800,31,100,30); 
    addApt.addActionListener(this); 
    //frame 
    g.drawRect(0, 0, 500, 700); 
    g.drawRect(500, 0, 500, 700); 

    //text fields and labels bounds 
    first = 120; 
    second = 150; 
    for(int i = 0; i < 5; i++){ 
     overFields[i].setBounds(first,second,100,20); 
     second += 30; 
     fields[i].setBounds(first, second, 300, 20); 
     second += 50; 
    } 
    addApt.setBounds(300,600,100,30); 

    repaint(); 

}//end of paint 

public void repaint(){ 


    int first = 550;//date number position 
    int second = 105; 
    for(int i = 0; i < 37; i++){//Setting date number position 
     for(int j = 0; j < 7; j++){//inner loop for a per week 
      if((i+j) >= 37)//if index finishes, but loop still has days in week that would call out of bounds 
       continue; 
      allDays[i+j].setBounds(first,second,10,10);//added index's for specific day of week 
      first+=71; 

     } 
     i+=6; 
     //setting bounds 
     second+=100; 
     first=550; 
    } 
} 

public void actionPerformed(ActionEvent evt){ 
    if (evt.getSource()==next){ 
     current++; 
     if(current == 12){//resets to January 
      current = 0; 
      year++; 
      String now="Year " + year; 
      showYear.setText(now); 


     } 
     month.setText(months[current]); 
     for (int i = 0; i < 37; i++){//setting proper day numbers 
      if(allDays[i].getText().equals(monthDays[current==0 ? 11:current-1]))//so you don't access index -1 
       dateHold=i +1;//for zero index of i 
      dateHold%=7;//date left off at 
     } 

     //dateHold++; 
     for(int j = 0; j < 37; j++)//erase dates 
      allDays[j].setText(""); 

     for(int i = 0; i < 37; i++){//sets dates 

      stringParse = Integer.parseInt(monthDays[current]); 
      if(current==1 && (i+2) == stringParse && year%4!=0){//on the 28 of non leap years feb, print then break loop 
       allDays[dateHold].setText("" + (i+1)); 
       break; 
      } 
      if((i+1) > stringParse)//without going over max per month 
       continue; 
      allDays[dateHold].setText("" + (i+1)); 
      dateHold++; 
     } 
     for(int i = 0; i < 37; i++){ 
      eventMarker[i].setText("|;"); 
     } 

    }//end next evt 

    if (evt.getSource()==last){//NOT CURRENTLY WORKING... 
     current--; 
     if(current == -1){//resets to February 
      current = 11; 
      year--; 
      String now = "Year " +year; 
      showYear.setText(now); 
     } 
     month.setText(months[current]); 

     stringParse = Integer.parseInt(monthDays[current]); 
     for (int i = 0; i < 7; i++){//check first week 
      if(allDays[i].getText().equals("1")){ 
       dateHold =i;//plus then minus to fix index and next month 
      } 
     } 
     for(int j = 0; j < 37; j++)//erase dates 
      allDays[j].setText(""); 

     int something;//local number holder 

     int countDown = stringParse;//local count down for reverse printing 
     if(current ==1 && year%4!=0)//February fix 
      countDown = 28; 
     something = countDown - 1 + (dateHold); 
     for (int i = 36; i >0; i--){//reverse date printing 


      if(((36 -i)-dateHold)>stringParse)//if date over max 
       continue; 


      if(something < 0) 
       continue; 

      try{//kept reaching out of index here 
      allDays[something].setText("" + (countDown)); 
      //System.out.println("i:" + i + "\ndateHold:" + dateHold + "\ncountDown:" + countDown); 
      } 
      catch(ArrayIndexOutOfBoundsException e){ 
       System.out.println("error i:" + i + "\ndateHold:" + dateHold + "\ncountDown:" + countDown); 
      } 
      countDown--; 
      something--; 
      if(countDown <= 0) 
       break; 
     } 
     for(int i = 0; i < 37; i++){ 
      eventMarker[i].setText("|;"); 
     } 

    }//end last evt 

    String theDate; 
    int numDate; 
    if(evt.getSource() == fields[0]){ 
     theDate = fields[0].getText(); 

     try{ 
      numDate = Integer.parseInt(theDate); 
      usrMonth[overallIndex] = months[(numDate-1)]; 
     }catch(NumberFormatException e){ 
      System.out.println("Error field[0]"); 
     } 
     catch(ArrayIndexOutOfBoundsException e){} 

    }//end of fields[0] 

    if(evt.getSource() == fields[1]){ 
     theDate = fields[1].getText(); 
     try{ 
      numDate = Integer.parseInt(theDate); 
      usrDay[overallIndex] = theDate; 
     }catch(NumberFormatException e){System.out.println("Error field[1]");} 
     catch(ArrayIndexOutOfBoundsException e){} 
    }//end of fields[1] 

    if(evt.getSource() == fields[2]){ 
     theDate = fields[2].getText(); 
     try{ 
      numDate = Integer.parseInt(theDate); 
      usrYear[overallIndex] = numDate; 
     }catch(NumberFormatException e){System.out.println("Error field[2]");} 
     catch(ArrayIndexOutOfBoundsException e){} 
    }//end of fields[2] 

    if(evt.getSource() == fields[3]){ 
     theDate = fields[3].getText(); 
     usrInfo[overallIndex] = theDate; 
    } 

    if(evt.getSource() == addApt){ 
     if(usrDay[overallIndex] != null && usrMonth[overallIndex] != null){ 



      theDate = fields[1].getText(); 
      try{ 
       numDate = Integer.parseInt(theDate); 
       usrDay[overallIndex] = theDate; 
      }catch(NumberFormatException e){System.out.println("Error field[1]");} 
      catch(ArrayIndexOutOfBoundsException e){} 
      theDate = fields[2].getText(); 
      try{ 
       numDate = Integer.parseInt(theDate); 
       usrYear[overallIndex] = numDate; 
      }catch(NumberFormatException e){System.out.println("Error field[2]");} 
      catch(ArrayIndexOutOfBoundsException e){} 
      theDate = fields[3].getText(); 
      usrInfo[overallIndex] = theDate; 




      System.out.println("Appointment Added\n" + (String) usrDay[overallIndex] + "\n" + usrMonth[overallIndex] + "\n" + usrInfo[overallIndex] + "\n" +usrYear[overallIndex]); 

      checkEvent(); 
      repaint(); 
      overallIndex++;//ONLY PLACE THIS CAN HAPPEN 
      for (int i = 0; i < 5; i++) 
       fields[i].setText("Dont forget to press Enter."); 
     } 
    } 

}//end of action performed 

public void checkEvent(){ 
    try{for(int i = 0; i < MAX; i++){//checking for events 
     if(usrMonth[i].equals(months[current]) && 
       usrYear[i] == year){ 
      for(int j = 0; j < 37; j++){ 
       if(allDays[j].getText().equals(usrDay[i])){ 
        String hold = eventMarker[j].getText(); 
        hold += "*"; 
        eventMarker[j].setText(hold); 

       } 
      } 
     } 
    }} 
    catch(NullPointerException e){System.out.println("Null really");} 
} 


} 
+0

Jacob、Welcome to StackOverflow! [SSCCE](http://sscce.org/)は、あなたのコードを最もよく知っているので、私たちがこの問題を見つけるのに役立ちます。 2つの質問があるので、2つの別々の投稿を作成し、それぞれに別々のSSCCEを作成することを検討してください。 –

答えて

0

可能なNULL値:あなたは、例外を正確に得るのですか

usrMonth[i] 
allDays[j] 
allDays[j].getText() 
eventMarker[j] 

どのラインでは?

+0

最後のメソッドcheckEvent()をキャッチします。このIDEは私に行番号を教えてくれません、もし誰かがそれをする方法を知っていれば、それは気になります –

+0

try catchを削除して例外を出力させることはできませんか? – Tudor

+0

Jacob Minshall: "System.out.println(" Null really ");"の代わりに " "e.printStackTrace()"を実行すると、stderrにスタックトレースが出力されます。 –