【问题标题】:Passing my class data to a driver class gives exception?将我的类数据传递给驱动程序类会产生异常吗?
【发布时间】:2016-03-05 23:34:48
【问题描述】:

我有这个类,它给了我颜色对象的 RGB 值。

import java.awt.*;
import java.util.Collection;
import java.util.HashMap;

public class ColorChooserRGB {
    public static void main(String[] args) {
        // Create new HashMap
        HashMap<String, Object> colorObjectsHashMap = new HashMap<>();

        // Fill with colors
        colorObjectsHashMap.put("black", Color.BLACK);
        colorObjectsHashMap.put("lightGray", Color.LIGHT_GRAY);
        colorObjectsHashMap.put("blue", Color.BLUE);
        colorObjectsHashMap.put("magenta", Color.MAGENTA);
        colorObjectsHashMap.put("cyan", Color.CYAN);
        colorObjectsHashMap.put("orange", Color.ORANGE);
        colorObjectsHashMap.put("darkGray", Color.DARK_GRAY);
        colorObjectsHashMap.put("pink", Color.PINK);
        colorObjectsHashMap.put("gray", Color.GRAY);
        colorObjectsHashMap.put("red", Color.RED);
        colorObjectsHashMap.put("green", Color.GREEN);
        colorObjectsHashMap.put("white", Color.WHITE);
        colorObjectsHashMap.put("yellow", Color.YELLOW);

        // Get all values from the HashMap and display them.
        System.out.println("Values of colorObjectsHashMap: ");
        Collection<Object> objValues = colorObjectsHashMap.values();
        for (Object value : objValues) {
            System.out.println("\t" + value);
        }
    }    

    public Color getColor(String selected) {
        return Color.decode(selected);
    }

    public Collection<Object> getKeySet() {
        return null;
    }
}

输出:

Values of colorObjectsHashMap:      
java.awt.Color[r=192,g=192,b=192]   
java.awt.Color[r=255,g=0,b=255]     
java.awt.Color[r=255,g=175,b=175]   
java.awt.Color[r=0,g=255,b=0]       
java.awt.Color[r=0,g=0,b=0]     
java.awt.Color[r=255,g=255,b=0]     
java.awt.Color[r=0,g=255,b=255]     
java.awt.Color[r=255,g=200,b=0]     
java.awt.Color[r=255,g=0,b=0]   
java.awt.Color[r=128,g=128,b=128]   
java.awt.Color[r=0,g=0,b=255]   
java.awt.Color[r=255,g=255,b=255]   
java.awt.Color[r=64,g=64,b=64]

FLOW:我需要在 ColorTest 类中使用我的新类 RGB 数据来选择一种颜色并以该颜色绘制一个形状。当它在“chooser = new ColorChooser();”处调用我的类时,我如何将我的 Object 数据传递给这个 ColorTest 类?我将 main 更改为“public Object[] colorChooser(List list)”并添加了“return objValues.toArray();”,但事实并非如此。那我回什么?我已经尝试了我的 IDE 中的一些建议,但它总是会引发更多问题。感谢您的帮助!

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;

public class ColorTest extends JFrame {
    private JList<String> colorList;
    private ColorChooser chooser;
    private JPanel drawPanel;

    public ColorTest() {
        super("List Test");

        setLayout(new GridLayout(2, 1));
        chooser = new ColorChooser();

        // create a list with items in colorNames array
        colorList = new JList<String>(chooser.getKeySet().toArray(new String[0]));
        colorList.setVisibleRowCount(5);
        colorList.setSelectedIndex(0);

        // do not allow multiple selections
        colorList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        JPanel choosePanel = new JPanel();

        // add a JScrollPane containing JList to content pane
        choosePanel.add(new JScrollPane(colorList));

        // set up event handler
        colorList.addListSelectionListener(
                new ListSelectionListener() { // anonymous inner class
                    // handle list selection events
                    public void valueChanged(ListSelectionEvent event) {
                        repaint();
                    }
                }
        ); // end call to addListSelectionListener

        drawPanel = new JPanel(); // create a drawing panel
        drawPanel.setBackground(Color.WHITE);

        // add the panels to the window
        add(drawPanel);
        add(choosePanel);

        setSize(300, 300);
        setVisible(true);
    }

    public void paint(Graphics g) {
        super.paint(g);

        // obtain the selected value
        Object selected = colorList.getSelectedValue();

        // set the color
        g.setColor(chooser.getColor((String)selected));

        // draw the rectangle
        Rectangle bounds = drawPanel.getVisibleRect();
        g.fillRect(bounds.x + 10, bounds.y + 30, bounds.width - 15, bounds.height - 15);
    }

    public static void main(String[] args) {
        ColorTest application = new ColorTest();
        application.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
} // end class ColorTest

结果: 线程“主”java.lang.NullPointerException 中的异常


更新的颜色选择器: ColorChooser 第 38 行 = 返回 Color.decode(objValues); ColorTest 第 62 行 = g.setColor(chooser.getColor((String)selected)); 结果:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at java.lang.Integer.decode(Integer.java:1161)
    at java.awt.Color.decode(Color.java:729)
    at edu.austincc.colors.ColorChooser.getColor(ColorChooser.java:38)
    at edu.austincc.colors.ColorTest.paint(ColorTest.java:62)
    at javax.swing.RepaintManager$4.run(RepaintManager.java:842)
    at javax.swing.RepaintManager$4.run(RepaintManager.java:814)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:789)
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:738)
    at javax.swing.RepaintManager.access$1200(RepaintManager.java:64)
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1732)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

【问题讨论】:

  • 你能分享一下异常的完整堆栈跟踪吗?
  • 这是什么?:edu.austincc.colors.ColorTest.(ColorTest.java:22) 处 edu.austincc. colors.ColorTest.main(ColorTest.java:70) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl。 java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
  • 是的。但是,很难从提供的示例中得出行号。你能告诉我们ColorTest.java的第22和70行有什么吗?
  • 好的,感谢您的耐心等待!第 22 行 ... colorList = new JList(chooser.getKeySet().toArray(new String[0]));第 70 行 ... ColorTest application = new ColorTest();

标签: java object hashmap


【解决方案1】:

从 cmets 中发布的堆栈跟踪来看,下面的行似乎正在抛出异常:

colorList = new JList&lt;String&gt;(chooser.getKeySet().toArray(new String[0]));

chooser.getKeySet() 正在返回一个null 对象,因此,在空对象上调用toArray 会引发异常。下面是getKeySet()的实现:

public Collection<Object> getKeySet() {
    return null;
}

在理想情况下,它应该返回什么取决于类/模块的功能。但是,如果我们想防止异常,那么我们可以使用以下实现(顺便说一句,它只是返回一个空列表):

public Collection<Object> getKeySet() {
    return Collections.<Object>emptyList();
}

【讨论】:

  • 啊哈,我明白了。这样就产生了没有颜色的彩盒;所以我只需要弄清楚如何让我的 colorObjectsHashMap.values() 进入 getKeySet() 的返回?
  • 仍然无法传递值;您能从中看出问题所在吗?:从 ColorTest 中,“g.setColor(chooser.getColor((String)selected));”存在问题当它试图访问 ColorChooser ... public Color getColor(String objValues) { // g.setColor(chooser.getColor((String)selected)) return Color.decode(objValues); } 再次感谢!
  • 你能更新有问题的例子吗? cmets的代码很难看懂。
  • 当然,我列出了问题行中的代码和 UPDATED 下的完整堆栈跟踪:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
  • 2020-09-10
相关资源
最近更新 更多