Java同一包下调用createLL()报未定义错误的原因
问题原因及解决办法
报错原因
你在LinkedListUse的main方法里直接写createLL(),Java会默认在当前类(LinkedListUse)中查找这个方法,但createLL()是CreateAndPrintLL类的非静态实例方法,不属于LinkedListUse。哪怕两个类在同一个包下,也不能直接跨类调用非静态方法——非静态方法必须通过所属类的对象才能调用。
解决办法
有两种可行的修改方式:
方式一:创建CreateAndPrintLL的实例对象调用方法
修改LinkedListUse的main方法,先实例化CreateAndPrintLL类,再通过对象调用方法:
package linkedlists; public class LinkedListUse { public static void main(String[] args) { // 创建CreateAndPrintLL类的实例 CreateAndPrintLL llTool = new CreateAndPrintLL(); Node head = llTool.createLL(); llTool.printLL(head); } }
方式二:将方法改为静态方法调用
如果不想创建对象,可以把CreateAndPrintLL里的createLL()和printLL()改成静态方法,这样就能直接通过类名调用:
修改CreateAndPrintLL类:
package linkedlists; import java.util.Scanner; public class CreateAndPrintLL { // 改为静态方法 public static Node createLL() { Scanner sc=new Scanner(System.in); int data=sc.nextInt(); Node head=null; while (data!=-1) { Node currentNode=new Node(data); if(head==null) { head=currentNode; } else { Node tail=head; while(tail.next!=null) { tail=tail.next; } tail.next=currentNode; } data=sc.nextInt(); } sc.close(); // 关闭Scanner避免资源泄漏 return head; } // 改为静态方法,同时修复输出和循环问题 public static void printLL(Node head) { Node temp=head; while(temp!=null) { System.out.print(temp.data + " "); // 原代码输出temp.next是错误的,应该输出节点数据 temp = temp.next; // 原代码缺少这一行,会导致死循环 } System.out.println(); } }
然后修改LinkedListUse的调用代码:
package linkedlists; public class LinkedListUse { public static void main(String[] args) { Node head = CreateAndPrintLL.createLL(); CreateAndPrintLL.printLL(head); } }
额外提示
原代码的printLL()方法有两个小问题:
- 输出语句写的是
System.out.print(temp.next);,这会打印Node对象的内存地址,不是节点存储的数据,应该改成System.out.print(temp.data + " "); - 循环体内没有移动
temp指针(temp = temp.next;),会导致死循环,必须加上这一行。
内容的提问来源于stack exchange,提问作者sushma jain
相关产品推荐
相关产品推荐

