2016-08-21 3 views
0

Вниз во втором классе с именем paintthis, в конструкторе я объявляю, что array = array.clone, и он говорит, что в массиве ничего нет? Я объявляю массив в LineGraph, а затем помещаю массив в peramiters, в котором есть конструктор имен второго класса painthis с массивами аргументов int [].nullpointerexception arrray = array.clone не работает?

package javatestframming; 

import java.awt.geom.*; 
import javax.swing.*; 
import java.awt.*; 
import java.util.*; 

public class LineGraph extends JFrame{ 
    public LineGraph(){ 
     super("Line Graph"); 
     int[] array = {1, 2, 3, 4, 5, 7, 8, 9}; 
     setSize(400, 400); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     paintthis gpane = new paintthis(array); 

     add(gpane); 
     setVisible(true); 
    } 

    public static void main(String[] args){ 
     LineGraph lg = new LineGraph(); 
    } 
} 

class paintthis extends JPanel{ 
    int[] xpoints; 
    paintthis(int[] array){ 
     xpoints = array.clone; 
    } 
    int max = arrayGetMaxInt(xpoints); 
    int min = arrayGetMinInt(xpoints); 
    int divisable = findDivisableWholeNumber(max, min); 
    Font f = new Font("Arial", Font.BOLD, 14); 
    FontMetrics fm = getFontMetrics(f); 

    public void paintComponent(Graphics g){ 
     Graphics2D g2d = (Graphics2D) g; 
     super.paintComponents(g); 
     int graphHeight = 200; 
     int graphWidth = 200; 
     int graphX = 10; 
     int graphY = 10; 
     float borderThickness = 5.0f; 
     //set graph background and border 
     g2d.setColor(Color.white); 

     g2d.fillRect(graphX, graphY, graphWidth, graphHeight); 

     g2d.setColor(Color.GRAY); 
     BasicStroke bs = new BasicStroke(borderThickness, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND); 
     g2d.setStroke(bs); 

     g2d.drawLine(graphX - (int)borderThickness, graphY, graphX + graphWidth, graphY); 
     g2d.drawLine(graphX - (int)borderThickness, graphY + graphHeight, graphX + graphWidth, graphY + graphHeight); 
     g2d.drawLine(graphX - (int)borderThickness, graphY, graphX - (int)borderThickness, graphY + graphHeight); 
     g2d.drawLine(graphX + graphWidth, graphY, graphX + graphWidth, graphY + graphHeight); 

     int trueGraphWidth = graphWidth - drawYAxis(g2d, graphWidth, graphHeight, max, min, divisable, graphY, graphX); 
     int trueGraphHeight = graphHeight - drawXAxis(g2d, graphY + graphHeight - fm.getHeight(), graphX, graphWidth, (int)borderThickness); 
     System.out.println(trueGraphWidth + " " + graphWidth); 
     drawPoints(g2d, trueGraphWidth, trueGraphHeight, (graphWidth - trueGraphWidth) + (int)borderThickness + graphX, (graphHeight - trueGraphHeight) + (int)borderThickness + graphY); 
    } 

    public int drawYAxis(Graphics2D g, int graphWidth, int graphHeight, int max, int min, int counts, int beginingpoint, int overx){ 
     graphHeight -= fm.getHeight(); 
     int averageSpaceInBetween = ((graphHeight-fm.getHeight())/((max - min)/counts)); //- ((fm.getHeight()/(graphHeight/fm.getHeight()))); 
     int space = 0; 
     Stack<Integer> stackAxisNumbers = new Stack<Integer>(); 

     g.setFont(f); 

     for (int x = 0; x <= (max - min); x+=counts){ 
      stackAxisNumbers.add(x + min); 
     } 

     for (int x = 0; x <= (max - min); x+= counts){ 
      g.drawString("$" + Integer.toString(stackAxisNumbers.pop()), overx, space + beginingpoint + fm.getHeight()); 
      space += averageSpaceInBetween; 
     } 

     space = 0; 
     return fm.stringWidth("$" + Integer.toString(max)); 
    } 
    public int drawXAxis(Graphics2D g, int beginingpoint, int overx, int graphWidth, int borderThickness){ 
     g.drawLine(overx - borderThickness, beginingpoint, overx + graphWidth, beginingpoint); 
     return beginingpoint - fm.getHeight(); 
    } 

    public void drawPoints(Graphics2D g, int graphWidth,int graphHeight, int startX, int startY){ 
     g.setColor(Color.blue); 
     int xSpace = (int) graphWidth/xpoints.length; 
     g.drawLine(startX, startY, xSpace + startX, xpoints[0]); 
    } 

    public int arrayGetMaxInt(int[] array){ 
     int max = 0; 
     for (int x: array){ 
      if (x > max){ 
       max = x; 
      } 
     } 

     return max; 
    } 
    public int arrayGetMinInt(int[] array){ 
     int min = max; 
     for (int x: array){ 
      if (x < min){ 
       min = x; 
      } 
     } 
     return min; 
    } 
    public int power(int base, int exp){ 
     int num = base; 
     for (int x = 1; x < exp; x++){ 
      num = num * base; 
     } 
     if (exp == 0){ 
      num = 1; 
     } 
     return num; 
    } 
    public int findDivisableWholeNumber(int max, int min){ 
     boolean passed = false; 
     int range = max - min; 
     int divis = 1; 
     int multiplier = 1; 
     out: 
     for (int x = 5; x > 0; x--){ 
      if (range >= power(10, x)){ 
       multiplier = x; 
       break; 
      } 
     } 
     out: 
     for (int x = 10 * multiplier; x <= 10 * multiplier && x > 0; x--){ 
      if(range%((int)(range/x)) == 0){ 
       divis = x; 
       passed = true; 
       break; 
      } 
     } 
     if (passed == false){ 
      out: 
      for (int x = 11 * multiplier; x <= (int)(range/2); x++){ 
       if(range%((int)(range/x)) == 0){ 
        divis = x; 
        passed = true; 
        break; 
       } 
      } 
     } 
     if (passed == false){ 
      System.out.println("ERROR -- NoWholeDiviableNumbersException"); 
      System.exit(0); 
     } 
     return divis; 
    } 
} 

Исключение:

Exception in thread "main" java.lang.NullPointerException 
at javatestframming.paintthis.arrayGetMaxInt(LineGraph.java:97) 
at javatestframming.paintthis.<init>(LineGraph.java:31) 
at javatestframming.LineGraph.<init>(LineGraph.java:15) 
at javatestframming.LineGraph.main(LineGraph.java:22) 
C:\Users\Morgan Higginbotham\AppData\Local\NetBeans\Cache\8.1\executor- snippets\run.xml:53: Java returned: 1 

BUILD FAILED (общее время: 1 секунда)

+3

Он должен быть 'клон()', 'не clone'. – Gendarme

+0

Не могли бы вы немного отформатировать код? –

ответ

1

При создании объекта с помощью paintthis gpane = new paintthis(array); Он будет инициализировать переменные уровня класса первого

int max = arrayGetMaxInt(xpoints); 

, тогда вызывается тело конструктора. В этом случае xpoints еще не инициализированы, так что вы получаете NullPointerException

Вы можете попробовать некоторые вещи, как этот

class paintthis extends JPanel{ 
int[] xpoints; 
int max; 
int min; 
int divisable; 
public paintthis(int[] array){ 
    xpoints = array.clone(); 
    max = arrayGetMaxInt(xpoints); 
    min = arrayGetMinInt(xpoints); 
    divisable = findDivisableWholeNumber(max, min); 
} 
Смежные вопросы