我是java和eclipse IDE的新手。
我正在运行Eclipse
Eclipse SDK 版本:3.7.1 构建ID:M20110909-1335
在Windows Vista计算机上。
我正在尝试从Thinking in Java vol4中学习。 作者使用自己的包来减少输入。然而,作者没有使用Eclipse,这就是问题所在的地方..
这是本书中代码的一个例子。
import java.util.*;
import static net.mindview.util.print.*;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("hello world");
print("this does not work");
}
这是print.Java的内容
//: net/mindview/util/Print.java
// Print methods that can be used without
// qualifiers, using Java SE5 static imports:
package net.mindview.util;
import java.io.*;
public class Print {
// Print with a newline:
public static void print(Object obj) {
System.out.println(obj);
}
// Print a newline by itself:
public static void print() {
System.out.println();
}
// Print with no line break:
public static void printnb(Object obj) {
System.out.print(obj);
}
// The new Java SE5 printf() (from C):
public static PrintStream
printf(String format, Object... args) {
return System.out.printf(format, args);
}
} ///:~
我得到的错误最多的是声明。
Import static net.mindview.util.print.*;
在这个问题上,Eclipse IDE说它无法解析网络
也在
上 print("this does not work");
Eclipse IDE说类HelloWorld的类print()不存在。
我一直试图让这些工作起作用,但只取得了有限的成功,autor在本书的其余部分使用了另外32个这样的包。
我试图将目录添加到类路径中,但这似乎只有在使用JDK编译器时才有效。我试图将它们添加为库,我尝试将它们导入到项目源文件中的包中。我已经尝试过其他一些东西,但现在不能记住它们。
我已经能够使其中一个文件正常工作,我在此消息中列出了print.java文件。我这样做是通过创建一个新的源文件夹然后在该文件夹中创建一个新包然后将print.java文件导入到包中。 但是下次我尝试同样的事情时,它对我不起作用。
我需要的是让eclipse在启动时加载所有这些.java文件的方法,所以当我需要它们进行书中的练习时,它们会在那里为我工作,或者只是让它们工作的简单方法每次。
我知道我不是唯一一个遇到过这个问题的人我在google搜索中看到过关于它的其他问题,他们也在询问Thinking in Java书籍。 我搜索了这个网站和其他人,我没有运气。
欢迎任何有关此消息或消息的帮助,非常感谢。
谢谢
好的,我已经尝试让这个工作正如你所说的,我已经启动了一个新项目,我从import语句中删除了静态,然后创建了一个新的源文件夹,然后我在源文件夹中创建了一个新包。然后我导入了文件系统并选择了net.mindview.util文件夹。
现在immport语句不再给我一个错误。但是print语句确实如此,使print语句工作的唯一方法是使用其完全限定名。这是代码。
import net.mindview.util.*;
public class Hello2 {
public static void main(String[] args) {
Hello2 test = new Hello2();
System.out.println();
print("this dooes not work");
net.mindview.util.Print.print("this stinks");
}
}
print语句的错误是: 对于Hello2
类型,方法print(String)未定义如果我尝试运行它,我得到的错误是: 线程“main”中的异常java.lang.Error:未解决的编译问题: 对于Hello2
类型,方法print(String)未定义at Hello2.main(Hello2.java:6)
语句::::: net.mindview.util.Print.print(“this stinks”)是完全限定的print语句,它不会抛出错误,但它完全违背了print.java的目的文件.. 如果您有任何疑问,请尽快回复您。
答案 0 :(得分:3)
我遇到过类似的问题。我按照以下步骤解决了这个问题:
我认为由于CLASSPATH而产生混淆。如果您使用Eclipse构建并运行代码,那么Eclipse将管理您的CLASSPATH。 (您不必在计算机属性的“环境变量”部分中手动编辑CLASSPATH,并且就Eclipse构建和运行而言,这样做不会改变任何内容。)
为了调用当前项目之外的代码(为方便起见,我将这个'外部代码'命名),你需要满足三件事: 答:您需要为该代码提供 .class文件(作为.class文件或在JAR中) B.您需要在源代码中指明在哪里查看以获取“外部代码” C.您需要指明在哪里开始寻找“外部代码”
为了满足这些要求,在本例中我们:
一个。构建项目UtilBuild,它创建我们需要的.class文件。
B中。添加语句import static net.mindview.util.Print。*;在我们的代码中
℃。在Eclipse中添加类文件夹库(Java Build Path-> Libraries)。
您可以通过检查直接存在于项目文件夹中的.classpath文件来调查步骤C的效果。如果您在记事本中打开它,您将看到类似于以下内容的行:
<classpathentry kind="lib" path="/UtilBuild>
您应该将它与import语句结合使用,以了解编译器查找.class文件的位置。结合path =“/ UtilBuild”和import static net.mindview.util.Print。*;告诉我们编译器将在:
中查找类文件UtilBuild/net/mindview/util
并且它将从Print.java文件(Print。*)开始构建每个类。
注:
声明
中的关键字静态没有问题import static net.mindview.util.Print.*;
static 这里只是意味着您不必指定Print.java中的类名,只需要指定要调用的方法。如果我们从import语句中省略关键字static,那么我们需要使用它所属的类来限定print()方法:
import net.mindview.util.Print.*;
//...
Print.print("Hello");
比静态导入更加冗长。
OPINION:
我认为大多数Java新手至少会在最初使用Eclipse。 Java中的Thinking似乎假设您将通过命令行执行操作(因此,它是编辑环境变量以更新CLASSPATH的指导)。结合使用本书最早的util文件夹代码,我认为这是该语言新学习者的混淆源。我希望将所有源代码组织到Eclipse项目中并可供下载。除此之外,将.class文件包含在'net / mindview / util'文件夹中是一件不错的选择,这样事情会更容易一些。
答案 1 :(得分:0)
你应该导入包static net.mindview.util
而不是static net.mindview.util.Print
你应该扩展类Print以使用它的方法.......
答案 2 :(得分:0)
您应该从导入声明中删除static
关键字,其中:import static net.mindview.util.print.*;
变为:import net.mindview.util.print.*;
如果这也不起作用,我假设你做了以下事情:
问题似乎是:package net.mindview.util;
必须与src
文件夹中的文件夹结构相匹配。因此,如果您的src
文件夹创建了一个新软件包并将其命名为net.mindview.util
,并且在其中放置了Print
类,那么您应该可以使其正常运行。
为了将来参考,您应该始终确保位于Java类顶部的package
decleration与它所在的包匹配。
编辑:
我看过你的编辑,问题似乎有一个简单的解决方案。您声明了一个名为print()
的静态方法。在java中,通过使用ClassName.methodName()
来访问静态方法。这样:print("this dooes not work");
将无效,因为您没有名为print
的方法,该方法在Hello2
类中使用字符串参数。在java中,当您编写排序methodName(arg1...)
的某些内容时,JVM将在您进行调用的类中查找具有该签名的方法(方法名称+参数),以及您的调用类可能使用的任何其他类延伸。
但是,正如您所正确指出的那样,这将有效net.mindview.util.Print.print("this stinks");
。这是因为您正在以正确的方式访问静态方法,这意味着ClassName.methodName();
。
简而言之,要解决您的问题,您需要:
print
的方法,该方法在Hello2
类中使用字符串参数; Print.print("this stinks");
这两种解决方案中的任何一种都适合你。
答案 3 :(得分:0)