Java,Hello World,《算法》环境搭建中的问题,用 cmd 和 IntelliJ Idea 分别编译和运行 Java 程序
▶ IntelliJ idea 下载和安装(http://www.jetbrains.com/idea/)
▶ 新建项目(如图),注意选择 SDK 类型和位置
● 在 src 目录中新建一个 Package,在该 Package 中新建一个 class,在编辑器中写该类的一个函数(主函数)如图,点击右上角锤子可以 build,或者在 build 和 run 选项卡中选择相应选项
● 执行结果
▶ 尝试运行了书中的一个代码(二分搜索与白名单),发现环境配置过程中有很多问题,姑且先把成功了的过程写在这里,仅供参考。
● 工作目录为 "testJava",文件目录如下,IntelliJ Idea 中建立了包 package01 和其中的一个类 class01.java,源文件放在其中(原始代码如下,大意是输入白名单文件和待筛查文件,输出白名单中不存在的值)。自动编译生成的文件是 class01.class。输入白名单数据 tinyW.txt,待筛查文件 tinyT.txt。
D:\CODE\JAVA\TESTJAVA
│ testJava.iml
│
├─.idea
│ misc.xml
│ modules.xml
│ workspace.xml
│
├─out
│ └─production
│ └─testJava
│ └─package01
│ class01.class
│
└─src
└─package01
class01.java
package package01; import java.util.Arrays; import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.In; public class class01
{
private class01() {} public static int indexOf(int[] a, int key)
{
int lo = 0, hi = a.length - 1;
while (lo <= hi)
{
int mid = lo + (hi - lo) / 2;
if (key < a[mid]) hi = mid - 1;
else if (key > a[mid]) lo = mid + 1;
else return mid;
}
return -1;
} @Deprecated
public static int rank(int key, int[] a
{
return indexOf(a, key);
} public static void main(String[] args)
{
In in = new In(args[0]);
int[] whitelist = in.readAllInts(); Arrays.sort(whitelist); while (!StdIn.isEmpty())
{
int key = StdIn.readInt();
if (class01.indexOf(whitelist, key) == -1)
StdOut.println(key);
}
}
}
● 前提工作:JDK 版本和 JRE 版本要对应(https://www.oracle.com/technetwork/java/javase/downloads/index.html),否则会能编译不能运行,报错为 UnsupportedClassVersionError;安装教材附带的类库 algs4(https://algs4.cs.princeton.edu/code/,拖到中间一些的部分),需要管理员权限运行,会自动下载和安装到用户目录,设置环境变量。相关链接(https://blog.csdn.net/fsx892512592/article/details/6038448,https://blog.csdn.net/u014629433/article/details/51593164,https://blog.csdn.net/u011240877/article/details/52457904)
● 使用命令行进行操作:将输入文件 tinyW.txt 和 tinyT.txt 放到 src 目录下,如图所示。这里有若干可以说的事情:
① 设置环境变量 CLASSPATH 为 "." 以及 algs4.jar 的绝对路径,可以在我的电脑的属性里添加,也可以在命令行里临时添加,还可以在 javac 命令中以选项的方式添加;有说法认为需要附上当前目录 ".",我测试中有的代码需要加,有的代码不需要,以防万一还是加上吧。如果不添加环境变量,则编译报错 "程序包edu.princeton.cs.algs4不存在" 以及后续的 "找不到符号XXX"(程序用到了 algs4 中的 In,StdIn,StdOut 等方法),如下图所示。相关链接(https://blog.csdn.net/skyebefreeman/article/details/56495637)
D:\Code\Java\testJava\src\package01>javac class01.java // 不添加环境变变量的编译
class01.java:: 错误: 程序包edu.princeton.cs.algs4不存在
import edu.princeton.cs.algs4.StdIn;
^
class01.java:: 错误: 程序包edu.princeton.cs.algs4不存在
import edu.princeton.cs.algs4.StdOut;
^
class01.java:: 错误: 程序包edu.princeton.cs.algs4不存在
import edu.princeton.cs.algs4.In;
^
class01.java:: 错误: 找不到符号
In in = new In(args[]);
^
符号: 类 In
位置: 类 class01
class01.java:: 错误: 找不到符号
In in = new In(args[]);
^
符号: 类 In
位置: 类 class01
class01.java:: 错误: 找不到符号
while (!StdIn.isEmpty())
^
符号: 变量 StdIn
位置: 类 class01
class01.java:: 错误: 找不到符号
int key = StdIn.readInt();
^
符号: 变量 StdIn
位置: 类 class01
class01.java:: 错误: 找不到符号
StdOut.println(key);
^
符号: 变量 StdOut
位置: 类 class01
个错误
② 代码首行写了包名,运行时需要退到含有完整包名那一层目录再运行。实测代码中不加包名(把源代码第一行注释掉)仍能正确编译,但是运行时会出现下面的效果,总之都无法加载主类(注意是两种错误)。相关链接(https://www.zhihu.com/question/36537093,http://www.cnblogs.com/wangxiaoha/p/6293340.html,https://blog.csdn.net/codefellow/article/details/76601885,https://blog.csdn.net/u014427391/article/details/79743318,https://www.cnblogs.com/xyhz0310/p/6803950.html)
D:\Code\Java\testJava\src\package01>java class01.class tinyW.txt < tinyT.txt // 内层执行,代码无包名
错误: 找不到或无法加载主类 class01.class
原因: java.lang.ClassNotFoundException: class01.class D:\Code\Java\testJava\src\package01>java package01.class01.class tinyW.txt < tinyT.txt // 内层执行,代码有包名
错误: 找不到或无法加载主类 package01.class01.class
原因: java.lang.ClassNotFoundException: package01.class01.class D:\Code\Java\testJava\src\package01>cd .. D:\Code\Java\testJava\src>java class01 tinyW.txt < tinyT.txt // 外层执行,代码无包名
错误: 找不到或无法加载主类 class01
原因: java.lang.ClassNotFoundException: class01 D:\Code\Java\testJava\src>java package01.class01 tinyW.txt < tinyT.txt // 外层执行,代码有包名
错误: 找不到或无法加载主类 package01.class01
原因: java.lang.NoClassDefFoundError: class01 (wrong name: package01/class01)
③ 同时使用输入文件和重定向将两个文件喂给程序,输出了正确的结果,这里没有太大问题。
● Idea 中先准备库路径(类似添加环境变量):File → Project Structure → Modules → 右边的 "+" → JARs or directories → 选择上面安装的 algs4.jar(C:\User\Username\algs4\algs4.jar)→ 左边 □ 不清楚是否要勾上,右边的 Compile / Run / Test / Provided 不清楚要选哪个,姑且选了 compile。相关链接(https://blog.csdn.net/t95921/article/details/53585225)
● 点击原谅锤编译,生成字节码文件在 out 目录下,缺少库则会报错,缺少包名仍能正确编译
● 设置运行时配置(原谅锤右边的框)如下图。写了主类(好像必填),输入参数(注意输入文件的相对路径是相对工作目录而言的,不要像上面 cmd 方式那样放进 src 或 out 目录),工作目录,类路径,其他没有改动
● 至此,程序能够正常开始运行,但还有点问题。
① 直接运行会发现程序会卡在 while (!StdIn.isEmpty()) 。理由是此时 Std 中内容不明,反正找不到可以作为输入结束的字符,所以会一直挂住。用 step into 去看会进入 StdIn.java ,如下所示,卡在 return 这一行上。需要运行时(卡住以后)在 运行窗口中手动补充结尾符 "^D"(Ecplise 或 Linux 环境中可能是 "^Z"),解决问题。相关链接(https://www.zhihu.com/question/62001393,https://blog,.csdn.net/dmbjzhh/article/details/80525487,https://stackoverflow.com/questions/18437181/simulate-input-from-stdin-when-running-a-program-in-intellij,https://stackoverflow.com/questions/34972425/executing-nothing-java-project-in-intellij-idea,https://stackoverflow.com/questions/14991760/stdin-isempty-java,http://www.1point3acres.com/bbs/thread-2463-1-1.html)
public final class StdIn
{
... public static boolean isEmpty()
{
return !scanner.hasNext();
} ...
}
② 源代码使用运行参数是 "tinyW.txt < tinyT.txt",尝试打印输入参数,发现 arg[0] = "tinyW.txt";arg[1] = "<";arg[2] = "tinyT.txt",理论上应该没有问题(主函数自行处理 "<" 后的重定向文件参数),不清楚原因,不能自动完成输入。
③ 另一种解决方案,最后我把代码改成如下所示(不耐烦用 StdIn 和重定向输入,而是手工读取和检测边界),运行参数为 "tinyW.txt tinyT.txt",能够正确输出结果。本章下一篇博客才成功使用教材自带的 StdIn / StdOut 等方法,可以作为参考。
package package01; import java.util.Arrays; import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.In; public class class01
{
private class01() {} public static int indexOf(int[] a, int key)
{
int lo = 0, hi = a.length - 1;
while (lo <= hi)
{
int mid = lo + (hi - lo) / 2;
if (key < a[mid]) hi = mid - 1;
else if (key > a[mid]) lo = mid + 1;
else return mid;
}
return -1;
} @Deprecated
public static int rank(int key, int[] a)
{
return indexOf(a, key);
} public static void main(String[] args)
{
In in = new In(args[0]);
In in2 = new In(args[1]); int[] whitelist = in.readAllInts();
int[] test = in2.readAllInts(); Arrays.sort(whitelist);
Arrays.sort(test); for(int i=0;i<test.length;i++)
{
int key = test[i];
if (class01.indexOf(whitelist, key) == -1)
StdOut.println(key);
}
}
}
▶ 其他问题
● 修改项目的类名,要注意类文件名和代码中用到类名的地方都要改掉
● 命令行 javac 默认支持 ASCII 编码,代码里有中文注释要去掉,或者在 javac 命令中使用选项 -encoding UTF-8 来改变使用的编码类型。
Java,Hello World,《算法》环境搭建中的问题,用 cmd 和 IntelliJ Idea 分别编译和运行 Java 程序的更多相关文章
- java: Eclipse jsp tomcat 环境搭建(完整)
] 欢迎您! 要学习一门语言,首先要做的就是搭建环境,然后能写一个小的Demo(类似Helloworld),不仅可以建立信心,而且还可以为之后的学习搭建一个验证平台,事半功倍. net领域的vs,号称 ...
- Spark+ECLIPSE+JAVA+MAVEN windows开发环境搭建及入门实例【附详细代码】
http://blog.csdn.net/xiefu5hh/article/details/51707529 Spark+ECLIPSE+JAVA+MAVEN windows开发环境搭建及入门实例[附 ...
- JAVA基本常识及环境搭建
JAVA基本常识及环境搭建 常用dos命令行 dir 列出当前目录下的文件以及文件夹 md 创建目录 cd 进入指定目录 cd.. 退回到上一级目录 cd/ 退回到根目录 del 删除文件 删除单个文 ...
- [Java 教程 02] 开发环境搭建
在上一篇文章对Java做了一个简单介绍之后,我想大家都已经对她有一个初步的认识了吧!那踏入正式学习使用Java之前,我们有一步是不得不做的,它是什么呢?没有错,就是我们本篇文章的标题所说,搭建Java ...
- Java+Selenium3.3.1环境搭建
一.背景和目的 selenium从2.0开始,加入了webdriver,实际上,我们说的selenium自动化测试,大部分情况都是在使用webdriver的API.现在去Selenium官网,发现最新 ...
- Java ee 与安卓环境搭建个人心得
最近加了个IT俱乐部,第一次作业就是搞定eclipse,完成Java ee 与安卓环境搭建.为此我上网看了好多教程,之前我安装了Java,可以说省了不少事,而且还了解一点安装方法.流程网上都有,但是不 ...
- Mybatis环境搭建中的案例分析 及 如果自己编写DAO接口的实现类
Mybatis环境搭建中的案例分析public static void main (String[] args) throws Exception { //读配置文件 //第一个: 使用类加载器,只能 ...
- 《Java Web程序设计——开发环境搭建》
Java Web程序设计--开发环境搭建 一.JDK下载.安装以及环境变量的配置: 官网:https://www.oracle.com/java/technologies/download ...
- Java、Android 开发环境搭建
一.准备工作 为便于管理,将java开发工具集中到一个文件夹中.创建D:\javaDevE文件夹,JDK.Android-SDK.Eclipse.tomcat等都可以安装到这个文件夹中. 二.搭建Ja ...
随机推荐
- require的定义看不懂【2】
一段代码扔出来,前不着村后不着店的,各种全局变量 还有,现在还在纠结Id,url, 作者充其量也在写读书笔记,完全沿着自己思路走,也不管读者是否跟得上,这居然也能出书. 这一段,掌握源码,或者写过的人 ...
- 黄聪:jquery+Datatables出现数据过长,表格不自动换行,columns设置width失效的办法
添加下面的CSS代码即可: table.dataTable.nowrap th, table.dataTable.nowrap td{white-space: normal !important;}
- [蓝桥杯]ALGO-86.算法训练_矩阵乘法
问题描述 输入两个矩阵,分别是m*s,s*n大小.输出两个矩阵相乘的结果. 输入格式 第一行,空格隔开的三个正整数m,s,n(均不超过200). 接下来m行,每行s个空格隔开的整数,表示矩阵A(i,j ...
- 【java】之equals和==区别
Java中数据类型可以分为两类 1.基本数据类型(byte,short,char,int,float,double,long,boolean) 2.复合数据类型(类,String等) Δ在基本数据 ...
- C/C++基础----标准库几个工具库tuple,bitset,正则表达式,随机数,IO库
tuple tuple可以有任意多个成员 默认初始化,值初始化 构造函数是explicit,必须直接初始化 make_tuple(v1,v2,-,vn) get<i> (t) 返回第i个数 ...
- java1.8新特性(optional 使用)
经常在程序中出现 java.lang.NullPointerException 为了避免 报错,总是要进行一些 是否为null 的if else 判断 ,1.8 可以使用optional 类 来简 ...
- springboot+dubbo+tomcat部署出错问题
刚用springboot+dubbo有点不熟悉,部署的时候出现了问题 1 The APR based Apache Tomcat Native library which allows optimal ...
- Ring0创建事件Ring3设置事件
同步事件(synchronizationEvent)当事件对象为激发时,如遇到KeWaitForXX等内核函数,事件对象则自动变回未激发态通知事件(NotificationEvent)当事件对象为激发 ...
- C/S模型服务端vsftpd的安装与卸载
c/s模型 连接光驱DVD 设置环境(软件安装的环境) mkdir /mnt/yw----------------------(创建一个在mnt下yw目录) mount /dev.sr0 /mnt/y ...
- android实现3D Gallery 轮播效果,触摸时停止轮播
1.轮播控件涉及到的两个类 CarouselViewPager.java public class CarouselViewPager extends ViewPager { @IntDef({RES ...