说明 | 快捷键 |
---|---|
复制代码-copy | ctrl + c |
粘贴-paste | ctrl + v |
剪切-cut | ctrl + x |
撤销-undo | ctrl + z |
反撤销-redo | ctrl + shift + z |
保存-save all | ctrl + s |
全选-select all | ctrl + a |
说明 | 快捷键 | 解释 |
---|---|---|
智能提示-edit | alt + enter | 1:出错后提示的解决办法 / 2:光标放到new xxx();最后,会自动接收变量 |
提示代码模板-insert live template | ctrl+j | 使用代码模板的时候,如果忘记了可以查看所有的代码模板 |
使用xx块环绕-surround with … | ctrl+alt+t | 使用if分支,for循环,try-catch包裹代码 |
调出生成getter/setter/构造器等结构-generate … | alt+insert | 或者直接在页面右键–generate |
自动生成返回值变量-introduce variable … | ctrl+alt+v | 类似于alt + enter生成代码的返回值 |
复制指定行的代码-duplicate line or selection | ctrl+d | 在每行代码的最后可以直接复制这一行代码 |
删除指定行的代码-delete line | ctrl+y | 在每行代码的最后可以直接删除这一行代码 |
切换到下一行代码空位-start new line | shift + enter | 鼠标光标不用放到代码后面在换行 |
切换到上一行代码空位-start new line before current | ctrl +alt+ enter | 鼠标光标不用放到代码后面在换行 |
向上移动代码-move statement up | ctrl+shift+↑ | 光标停留在每行代码的最后,向上移动代码,只能在方法内 |
向下移动代码-move statement down | ctrl+shift+↓ | 光标停留在每行代码的最后,向下移动代码,只能在方法内 |
向上移动一行-move line up | alt+shift+↑ | 同上,只不过移动范围更大了,可以超出方法 |
向下移动一行-move line down | alt+shift+↓ | 同上,只不过移动范围更大了,可以超出方法 |
方法的形参列表提醒-parameter info | ctrl+p | 查看方法中可用的参数类型有哪些,第一次创建方法时会自动提示,但是一旦移动光标后再移动回来就不显示了,这时可以使用此快捷键 |
说明 | 快捷键 | 解释 |
---|---|---|
批量修改指定的变量名、方法名、类名等-rename | shift+f6 | 选中需要修改的名字使用快捷键直接输入新名字即可 |
抽取代码重构方法-extract method … | ctrl+alt+m | 把选中的代码,重新放到一个新的方法中。抽取静态的方法 新方法仍为静态的,抽取非静态方法中的代码新方法为非静态的 |
重写父类的方法-override methods … | ctrl+o | 查看可以重写的所有父类方法 |
实现接口的方法-implements methods … | ctrl+i | 查看可以实现所有父接口的方法 |
选中的结构的大小写的切换-toggle case | ctrl+shift+u | 略 |
批量导包-optimize imports | ctrl+alt+o | 用不着,之前设置过自动导包了 |
说明 | 快捷键 | 解释 |
---|---|---|
如何查看源码-go to class… | ctrl + 选中指定的结构 或 ctrl+n | 前提是在页面上写了相关代码 / 凭空搜索代码,页面不用写 |
显示当前类结构,支持搜索指定的方法、属性等-file structure | ctrl+f12 | 显示当前页面的所有属性和方法,之后可以直接输入名字进行搜索 |
退回到前一个编辑的页面-back | ctrl+alt+← | 一层层的查看源码,使用此快捷键可以回退到上一级查看源码的位置 |
进入到下一个编辑的页面-forward | ctrl+alt+→ | 回退到查看上一级源码之后,在想要进去下一级源码的位置 |
打开的类文件之间切换-select previous/next tab | alt+←/→ | 左右切换页面显示的导航栏窗口 |
光标选中指定的类,查看继承树结构-Type Hierarchy | ctrl+h | 查看选中类的继承结构 |
查看方法文档-quick documentation | ctrl+q | 查看代码的文档注释,不用快捷键也行 直接光标方到代码上就会自动显示 |
类的UML关系图-show uml popup | ctrl+alt+u | 光标放到代码上,使用此快捷键会以关系图的方式展示继承结构 |
定位某行-go to line/column | ctrl+g | 页面有很多行代码,使用此快捷键输入想要看的行号,光标会自动定位到此行号 |
回溯变量或方法的来源-go to implementation(s) | ctrl+alt+b | 光标放到变量名或者方法名的位置上,使用此快捷键可以直接定位到在哪个位置 定义的变量或方法 |
折叠方法实现-collapse all | ctrl+shift+ - | 折叠类中所有的方法,之后点击页面上的"+"可以打开其中想要查看的方法 |
展开方法实现-expand all | ctrl+shift+ + | 展开类中所有的方法 |
说明 | 快捷键 | 解释 |
---|---|---|
查找指定的结构 | ctlr+f | 查找在页面中使用到此关键字的地方,之后使用上下箭头一个个的查看 (还适用于world、记事本等等 ) |
快速查找:选中的Word快速定位到下一个-find next | ctrl+L | 使用ctlr+f 可以使用此快捷键进行查找使用此关键字的位置,类似于上下箭头 |
查找与替换-replace | ctrl+r | 可以一个个的查找决定哪一个需要替换和不替换,也可以直接替换所有 (还适用于world、记事本等等 ) |
直接定位到当前行的首位-move caret to line start | home | 光标定位到当前行的头部 |
直接定位到当前行的末位 -move caret to line end | end | 光标定位到当前行的尾部 |
查询当前元素在当前文件中的引用,然后按 F3 可以选择 | ctrl+f7 | 定义一个变量后,使用此快捷键可以查看下面在哪使用到了此变量,之后使用F3一个个的向下跳转 |
全项目搜索文本-find in path … | ctrl+shift+f | 可以查看在整Pproject工作空间下或者整个Module下那个位置使用了此代码。如果此快捷键失效,查看是否和输入法的热键冲突 |
关闭当前窗口-close | ctrl+f4 | 略,不仅仅适用于idea,还适用于其它窗口 |
说明 | 快捷键 | 解释 |
---|---|---|
格式化代码-reformat code | ctrl+alt+L | 代码写的格式比较混乱,在页面上使用此快捷键会自动对齐 |
使用/取消单行注释-comment with line comment | ctrl + / | 选中代码后,第一次使用是添加,再次使用是取消 |
使用/取消多行注释-comment with block comment | ctrl + shift + / | 选中代码后,第一次使用是添加,再次使用是取消 |
选中数行,整体往后移动-tab | tab | 略 |
选中数行,整体往前移动-prev tab | shift + tab | 略 |
苹果电脑或者是用惯Eclipse快捷的,可以选择其他快捷键插件。
编好的程序在执行过程中如果出现错误,该如何查找或定位错误呢?简单的代码直接就可以看出来,但 如果代码比较复杂,就需要借助程序调试来查找错误了。
运行编写好的程序时,可能出现的几种情况:
> 情况1:没有任何bug,程序执行正确!
====================如果出现如下的三种情况,都有必要使用debug=============================
> 情况2:运行以后,出现了错误或异常信息。但是通过日志文件或控制台,显示了异常信息的位置。
> 情况3:运行以后,得到了结果,但是结果不是我们想要的。
> 情况4:运行以后,得到了结果,结果大概率是我们想要的。但是多次运行的话,可能会出现不是我们想要的情况。
比如:多线程情况下,处理线程安全问题。
Debug(调试)程序步骤如下:
1、添加断点
2、启动调试
3、单步执行
4、观察变量和执行流程,找到并解决问题
在源代码文件中,在想要设置断点的代码行的前面的标记行处,单击鼠标左键就可以设置断点,在相同 位置再次单击即可取消断点。
IDEA提供多种方式来启动程序(Launch)的调试,分别是通过菜单(Run –> Debug)
、图标(“绿色臭虫”)
等等
或 (Debugger:可以查看里面的变量值。 Console:断点的控制台,可以查看System输出的值
)
package com.atguigu.debug;
/**
* ClassName: Debug01
* Package: com.atguigu.debug
* Description: 演示1:行断点 & 测试debug各个常见操作按钮
*
* @Author: 尚硅谷-宋红康
* @Create: 2022/10/20 18:44
* @Version 1.0
*/
public class Debug01 {
public static void main(String[] args) {
//1.
int m = 10;
int n = 20;
System.out.println("m = " + m + ",n = " + n);
swap(m, n);
System.out.println("m = " + m + ",n = " + n);
//2.
int[] arr = new int[] {1,2,3,4,5};
System.out.println(arr);//地址值
char[] arr1 = new char[] {'a','b','c'};
System.out.println(arr1);//abc
}
public static void swap(int m,int n){
int temp = m;
m = n;
n = temp;
}
}
package com.atguigu.debug;
import java.util.HashMap;
/**
* ClassName: Debug02
* Package: com.atguigu.debug
* Description: 演示2: 方法断点
*
* @Author: 尚硅谷-宋红康
* @Create: 2022/10/20 21:15
* @Version 1.0
*/
public class Debug02 {
public static void main(String[] args) {
//1.
Son instance = new Son();
instance.test();
//2.
Father instance1 = new Son();
instance1.test();
//3.
Consumer con = new ConsumerImpl();
con.accept("atguigu");
//4.
HashMap map = new HashMap();
map.put("Tom",12);
map.put("Jerry",11);
map.put("Tony",20);
}
}
class Father{
public void test(){
System.out.println("Father : test");
}
}
class Son extends Father{
public void test(){
System.out.println("Son : test");
}
}
interface Consumer{
void accept(String str);
}
class ConsumerImpl implements Consumer{
@Override
public void accept(String str) {
System.out.println("ConsumerImple:" + str);
}
}
package com.atguigu.debug;
/**
* ClassName: Debug03
* Package: com.atguigu.debug
* Description: 演示3:字段断点
*
* @Author: 尚硅谷-宋红康
* @Create: 2022/10/20 21:34
* @Version 1.0
*/
public class Debug03 {
public static void main(String[] args) {
Person p1 = new Person(3);
System.out.println(p1);
}
}
class Person{
private int id = 1;
private String name;
private int age;
public Person() {
}
{
id = 2;
}
public Person(int id) {
this.id = id;
}
public Person(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
package com.atguigu.debug;
/**
* ClassName: Debug04
* Package: com.atguigu.debug
* Description: 演示4:条件断点
*
* @Author: 尚硅谷-宋红康
* @Create: 2022/10/20 21:49
* @Version 1.0
*/
public class Debug04 {
public static void main(String[] args) {
int[] arr = new int[]{1,2,3,4,5,6,7,8,9,10,11,12};
for (int i = 0; i < arr.length; i++) {
int target = arr[i];
System.out.println(target);
}
}
}
针对上述代码,在满足arr[i] % 3 == 0
的条件下,执行断点。(在行断点
上右键进行设置)
package com.atguigu.debug;
import java.util.Date;
/**
* ClassName: Debug05
* Package: com.atguigu.debug
* Description: 演示5:异常断点
*
* @Author: 尚硅谷-宋红康
* @Create: 2022/10/20 22:01
* @Version 1.0
*/
public class Debug05 {
public static void main(String[] args) {
int m = 10;
int n = 0;
int result = m / n;
System.out.println(result);
// Person p1 = new Person(1001);
// System.out.println(p1.getName().toUpperCase());
}
}
通过下图的方式,对指定的异常进行监控:
package com.atguigu.debug;
/**
* ClassName: Debug06
* Package: com.atguigu.debug
* Description: 演示6:线程调试
*
* @Author: 尚硅谷-宋红康
* @Create: 2022/10/20 22:46
* @Version 1.0
*/
public class Debug06 {
public static void main(String[] args) {
test("Thread1");
test("Thread2");
}
public static void test(String threadName) {
new Thread(
() -> System.out.println(Thread.currentThread().getName()),
threadName
).start();
}
}
"Thread2".equals(Thread.currentThread().getName());
,获取当前线程的名字如果名字等于Thread2时,就停下。Thread1
都显示出来了,如果在进行下一步单步调试会一次次执行循环输出Thread2
。package com.atguigu.debug;
/**
*ClassName: Debug07
*Package: com.atguigu.debug
*Description: 演示7:强制结束
*
*@Author: 尚硅谷-宋红康
* @Create: 2022/10/20 23:15
*@Version 1.0
*/
public class Debug07 {
public static void main(String[] args) {
System.out.println("获取请求的数据");
System.out.println("调用写入数据库的方法"); insert();
System.out.println("程序结束");
}
private static void insert() {
System.out.println("进入insert()方法");
System.out.println("获取数据库连接");
System.out.println("将数据写入数据表中");
System.out.println("写出操作完成");
System.out.println("断开连接");
}
}
package com.atguigu.debug;
import java.util.HashMap;
/**
* ClassName: Debug08
* Package: com.atguigu.debug
* Description: 演示8:用户自定义数据视图
*
* @Author: 尚硅谷-宋红康
* @Create: 2022/10/20 23:21
* @Version 1.0
*/
public class Debug08 {
public static void main(String[] args) {
HashMap<Integer,String> map = new HashMap<>();
map.put(1,"高铁");
map.put(2,"网购");
map.put(3,"支付宝");
map.put(4,"共享单车");
System.out.println(map);
}
}
设置如下:
问题:使用Step Into时,会出现无法进入源码的情况。如何解决? (即:使用向下的蓝箭头只能进入到自定义的方法中,怎么进入到源码提供的方法中呢???
)
方案1:使用 force step into 即可 (单步执行,会进入到方法,方法可以来自核心类库的源码----使用向下的红箭头
)
方案2:点击Setting -> Build,Execution,Deployment -> Debugger -> Stepping
把Do not step into the classess中的 java.*
、 javax.*
取消勾选即可。(把蓝箭头向下的功能修改为和红箭头向下的功能相同,即 蓝箭头既可以进入到自定义的方法 也可以进入到源码的方法中
)
小结:
经验:初学者对于在哪里加断点,缺乏经验,这也是调试程序最麻烦的地方,需要一定的经验。
简单来说,在可能发生错误的代码的前面加断点。如果不会判断,就在程序执行的起点处加断点。
在IDEA中配置Tomcat之前,需要保证已经安装并配置了Tomcat的环境变量。如果没有安装并配置,可以 参考《 尚硅谷_宋红康_Tomcat8.5快速部署.docx 》
配置完成以后,在命令行输入:catalina run
。能够启动tomcat,则证明安装配置成功。
这里配置Tomcat的名称以及配置应用服务器的位置。根据自己Tomcat的安装位置决定。
选择:Web Application,选择Create web.xml,如下:
可以修改Application context,如下:修改访问的工程名
配置好后,可以直接运行:
解决方案:
1)点击Help => Edit custom VM Options,在最后面添加
-Dfile.encoding=UTF-8
2)在当前Tomcat实例中配置 VM option,添加
-Dfile.encoding=UTF-8
在第二步的Startup/Connection页签的Run和Debug添加一个key为 JAVA_TOOL_OPTIONS
, value为-Dfile.encoding=UTF-8
的环境变量
Maven是一款自动化构建工具,专注服务于Java平台的 项目构建
和 依赖管理
。在JavaEE开发的历史上构建工具的发展也经历了一系列的演化和变迁:
Make→Ant→Maven→Gradle→其他……
构建环节:
①清理:删除以前的编译结果,为重新编译做好准备。
②编译:将Java源程序编译为字节码文件。
③测试:运行单元测试用例程序,确保项目在迭代开发过程中关键点的正确性。
④报告:测试程序的结果。
⑤打包:将java项目打成jar包;将Web项目打成war包。
⑥安装:将jar包或war包安装到本地仓库中。
⑦部署:将jar或war从Maven仓库中部署到Web服务器上运行。
maven的下载 – 解压 – 环境变量的配置这里就不赘述了,需要的参考03-资料\05-Maven的配置中的《尚硅谷_Maven的配置_V2.0.docx
》。下面直接整合Maven。选择自己Maven的目录,和settings文件,然后配置自己的仓库reposiroty。
注意:每次新创建一个Project都要重新配置一下Maven,idea的其它配置只要配置一次即可。
指明当前maven工程的名称、模板等信息。这里要求一个项目组的jdk版本必须一致。
通过坐标,就可以定位仓库中具体的jar包。如下:
新创建的maven 的java工程缺少相应的resources文件目录,需要创建如下:
类似的操作test目录下,提供resources即可。
工程名
src
----main
--------java
--------resources
----test
--------java
--------resources
pom.xml
第1步:创建Maven的核心配置文件pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.atguigu.mavengroupId>
<artifactId>maven-01artifactId>
<version>1.0-SNAPSHOTversion>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>testscope>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.18version>
dependency>
dependencies>
project>
第2步:编写主程序代码
在src/main/java/com/atguigu/java目录下新建文件HelloMaven.java
package com.atguigu.java;
/**
* ClassName: HelloMaven
* Package: com.atguigu.java
* Description:
*
* @Author: 尚硅谷-宋红康
* @Create: 2022/10/20 18:20
* @Version 1.0
*/
public class HelloMaven {
public String sayHello(String message) {
return "Hello, " + message + "!";
}
}
第3步:编写测试代码
在/src/test/java/com/atguigu/java目录下新建测试文件HelloMavenTest.java
package com.atguigu.java;
import org.junit.Test;
/**
* ClassName: HelloMavenTest
* Package: com.atguigu.java
* Description:
*
* @Author: 尚硅谷-宋红康
* @Create: 2022/10/20 18:21
* @Version 1.0
*/
public class HelloMavenTest {
@Test
public void testHelloMaven() {
HelloMaven helloMaven = new HelloMaven();
System.out.println(helloMaven.sayHello("Maven"));
}
}
目录下也会有对应的生命周期。其中常用的是:clean、compile、package、install。
比如这里install,如果其他项目需要将这里的模块作为依赖使用,那就可以install。安装到本地仓库的位置。
补全步骤:
配置部署的详细信息:
解决方案:
1)点击Help => Edit custom VM Options,在最后面添加
-Dfile.encoding=UTF-8
2)在当前Tomcat实例中配置 VM option,添加
-Dfile.encoding=UTF-8
在第二步的Startup/Connection页签的Run和Debug添加一个key为 JAVA_TOOL_OPTIONS
, value为-Dfile.encoding=UTF-8
的环境变量
1、找不到HttpServlet错误
如果看到JSP报错:The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
可以加入如下依赖解决。
<dependency>
<groupId>javax.servletgroupId>
<artifactId>servlet-apiartifactId>
<version>2.5version>
<scope>providedscope>
dependency>
2、EL表达式没有提示问题
${pageContext}这个EL表达式中通过pageContext对象访问reuqest属性时本身是应该有提示的,但如果没有的话加入下面依赖即可。
<dependency>
<groupId>javax.servlet.jspgroupId>
<artifactId>jsp-apiartifactId>
<version>2.1.3-b06version>
<scope>providedscope>
dependency>
同时,针对index.jsp文件,修改一下文件头信息为:
<%@page language="java" pageEncoding="utf-8" contentType="text/html;UTF-8" %>
配置MySQL数据库的详细信息:
表面上很多人认为配置 Database 就是为了有一个 GUI 管理数据库功能,但是这并不是 IntelliJ IDEA 的Database 最重要特性。数据库的 GUI 工具有很多,IntelliJ IDEA 的 Database 也没有太明显的优势。
IntelliJ IDEA 的 Database 最大特性就是对于 Java Web 项目来讲,常使用的 ORM 框架,如 Hibernate、Mybatis 有很好的支持,比如配置好了 Database 之后,IntelliJ IDEA 会自动识别 domain 对象与数据表的关系,也可以通过 Database 的数据表直接生成 domain 对象等。
阿里巴巴Java编码规范检查插件,检测代码是否存在问题,以及是否符合规范。
安装插件步骤:
选择一个合适版本的插件:
有些插件想要生效需要重启idea:
使用:在类中,右键,选择编码规约扫描,在下方显示扫描规约和提示。根据提示规范代码,提高代码 质量。
可视化的字节码查看器。
使用:
英文设置:使idea出现的导航信息都变为英文(安装后使用插件的地方都由原来的中文变为英文)
在 Help -> Edit Custom VM Options …,加上
-Duser.language=en
注册翻译服务(有道智云、百度翻译开放平台、阿里云机器翻译)帐号,开通翻译服务并获取其应用ID 和密钥 绑定应用ID和密钥:偏好设置(设置) > 工具 > 翻译 > 常规 > 翻译引擎 > 配置…
使用:鼠标选中文本,点击右键即可自动翻译成多国语言。
注:请注意保管好你的应用密钥,防止其泄露。
安装插件:
设置翻译引擎:如果没有秘钥,需要先进行注册秘钥。
创建应用,生成秘钥信息:
复制秘钥信息:
填写生成的秘钥信息:
测试:选中代码右键----translate(翻译)
实际开发中还有一个非常常见的场景: 我们创建一个对象后,想依次调用 Setter 函数对属性赋值,如果属性较多很容易遗漏或者重复。
可以使用这 GenerateAllSetter 提供的功能,快速生成对象的所有 Setter 函数(可填充默认值),然后自己再跟进实际需求设置属性值。
给括号添加彩虹色,使开发者通过颜色区分括号嵌套层级,便于阅读
在编辑器右侧生成代码小地图,可以拖拽小地图光标快速定位代码,阅读行数很多的代码文件时非常实 用。
代码统计工具。
快捷键提示插件。当你执行鼠标操作时,如果该操作可被快捷键代替,会给出提示,帮助你自然形成使 用快捷键的习惯,告别死记硬背。
用于生成多个文档注释。
在 IDEA 里刷力扣算法题
根据 json 生成对象。
使用:使用alt + s 或 alt + insert调取。
举例:
{
"name": "tom",
"age": "18",
"gender": "man", "hometown": {
"province": "河北省",
"city": "石家庄市",
"county": "正定县"
}
}
查看生成的对应关系,如果不合适可以双击进行修改
生成的代码效果:
package com.cn;
/**
* ClassName: TestJson
* Package: com.cn
* Description:
*
* @Author xxx
* @Create 2023/5/4 12:57
* @Version 1.0
*/
public class TestJson {
private String name;
private Integer age;
private String gender;
private HometownDTO hometown;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public HometownDTO getHometown() {
return hometown;
}
public void setHometown(HometownDTO hometown) {
this.hometown = hometown;
}
/**
* 生成的静态内部类
*/
public static class HometownDTO {
private String province;
private String city;
private String county;
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCounty() {
return county;
}
public void setCounty(String county) {
this.county = county;
}
}
}
对于很多人而言,写代码时略显枯燥的,如果能够安装自己喜欢的主题将为开发工作带来些许乐趣。
IDEA 支持各种主题插件,其中最出名的当属 Material Theme UI。
安装后,可以从该插件内置的各种风格个选择自己最喜欢的一种。
对于初学者,好多IDEA的配置, 都是英文不是特别熟悉.因此官方提供了汉化补丁,从此使用无压力 ,个人感觉好用.
包含chinese和lombok都安装一下.安装好之后重启IDEA即可.
文件—设置 (快捷键:ctrl +alt+s) chinese lombak