今天碰到了一个很怪的问题。
同一个包下,我建立了两个Java文件(想拿来做Javabean的),分别为DBLink.java 和DBUtil.java。编译好DBLink后,编译DBUtil.java时却出现 cannot find symbol  ( DBLink)字样。
  后来,我没有按照先后顺序编译,而是直接 Java *.java 这样就不会出问题了。这是为什么呢?因为我的两个源码存在明显的先后关系( DBLink 是连接数据库 DBUtil是一些实用操作),那为什么分开编译后就不可以了呢?????
谢谢   
// Java Document
package leeWebDemo1.database;
import java.sql.*;
public class DBLink
{
private static Connection conn;
private Statement stmt;
private ResultSet rs;
private static final String mysqlDriver="com.mysql.jdbc.Driver";
  private static final String url="jdbc:mysql://localhost:3306/mysql?user=root&password=123456";
 
public static synchronized Connection getConn() throws Exception
{
  try
{
Class.forName(mysqlDriver);
conn=DriverManager.getConnection(url);
return conn;
}
catch(SQLException e)
{
System.err.println(e.getMessage());
System.err.println(e.getMessage());
System.err.println("加载驱动失败!");
throw e; 
}
}

//获取Statement 只用于查询语句
public Statement getStmtread()
{
try
{
conn=getConn();
stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
return stmt;

}

catch(Exception e)
{
System.err.println(e.getMessage());
e.printStackTrace();
}

return null;
}

//获取ResultSet

public ResultSet getRs(String sql)
{
try
{
stmt=getStmtread();
rs=stmt.executeQuery(sql);
return rs;
}

catch(Exception e)
{
System.err.println(e.getMessage());
e.printStackTrace();
}
return null;
}




//获取statement 与上面的getStmtread不同用于删除、更新和添加的SQL语句;
public Statement getStmt()
{
try
{
conn=getConn();
stmt=conn.createStatement();
return stmt;

}
catch(Exception e)
{
System.err.println(e.getMessage());
e.printStackTrace();
}

return null;


}


//关闭数据库
public synchronized void close()
{
try
{
if(rs!=null)
rs.close();
rs=null;
}
catch(Exception e)
{
System.err.println(e.getMessage());
e.printStackTrace();
}

try
{
if(stmt!=null)
{
stmt.close();
stmt=null;
}

}

catch(Exception e)
{
System.err.println(e.getMessage());
e.printStackTrace();
}

try
{
if(conn!=null)
{
conn.close();
conn=null;
}
}
catch(Exception e)
{
System.err.println(e.getMessage());
e.printStackTrace();
}


}
}
// 本JavaBean包括数据的插入、更新、删除和查询等。package leeWebDemo1.database;
import java.sql.*;public class DBUtil
{
private DBLink dblink=new DBLink();
private Statement stmt;
private ResultSet rs;  
//获取查询的行数:没有结果返回-1,查询异常返回-2;
 
public int getRowCount(String strSql)
{
int intCount=0;
try{

stmt=dblink.getStmtread();
rs=stmt.executeQuery("SELECT COUNT(*) FROM"+strSql);
if(rs.next())
{
intCount=rs.getInt(1);
}
else intCount=-1; 
}
catch(Exception e)
{
intCount=-2; 
}
finally
{
dblink.close();
return intCount;
}
}

//执行插入操作 
public int insert(String strSql)
{
int count=0;
stmt=dblink.getStmt();
try
{
count=stmt.executeUpdate(strSql);
 
}
catch(Exception e)
{
count=-2;
System.err.println(e.getMessage());
e.printStackTrace();
}
finally
{

dblink.close();
return count;
}

}

//更新数据库数据
public int update(String sql)
{
int count=0;
stmt=dblink.getStmt();
try
{
count=stmt.executeUpdate(sql);
}
catch(Exception e)
{
count=-2;
System.err.print(e.getMessage());
e.printStackTrace();
}
finally
{
dblink.close();
return count;
}

}


//删除数据库数据

public int delete(String sql)
{
int count=0;
stmt=dblink.getStmt();
try
{
count=stmt.executeUpdate(sql);
  
}

catch(Exception e)
{
count=-2;
System.err.println(e.getMessage());
e.printStackTrace();

}

finally
{
dblink.close();
return count;
}



}

 


}

解决方案 »

  1.   

    个人理解:单独编译的时候,系统会去查找对应的支持类,如果找不到,就会报错(她不会去尝试编译那个依赖的.java文件,因为你没让他编译,否则就乱了)而*的编译方式,系统会将当前的所有java作为整体,而不是个体来考虑。
    有兴趣可以看看【编译原理】 记得大学是计算机系有这门课。 我们系没有。我们学【化工原理】
      

  2.   

    分开编译也是可以的 。
    如果你先编译 DBLink 再编译 DBUtil 就不会出现你的问题。
    如果先编译DBUtil 
    因为你的
    DBUtil 引用 DBLink 但是 你的 DBLink 的 .class文件并没有生成 也就是你的classpath下没有这个类 所以会报错。
    如果用*.java编译。 可能就是版主说的编译原理啦。 把你的两个类当成一个工程来处理。自动管理编译的顺序。瞎掰的!!!
      

  3.   

    我编译通过了啊,在命令行输入
    >javac leeWebDemo1\database\DBUtil.java 程序都编译过了LZ估计前面的默认路径不对,是在..\leeWebDemo1\Database>javac DBUtil.java
    此时编译会提示找不到 DBLink
      

  4.   

    java *.java 将包中的一起编译.
      

  5.   

    还是存在疑问。按照环境变量的设置,Java编译应该现在当前目录查看吧~那它们在同一个包应该先查看下啊。回2楼:我就是先编译DBLink的。
    回3楼,我的web目录不是eclipse等ide的默认工作空间,我是使用记事本写的,所以没有什么默认的目录的。
      

  6.   

    环境变量是看jdk的,找javac还有系统目录下jar的吧
    javac有参数引入jar,好像也有引入class的