// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= NetBeans IDE 中的 JDK 7 支持概述
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: NetBeans IDE 中的 JDK 7 支持概述 - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, NetBeans IDE 中的 JDK 7 支持概述

NetBeans IDE 支持 Java 7 语言功能，例如菱形运算符、switch 中的 String、multicatch 等。在代码中使用这些结构时，IDE 会识别它们，在代码完成中提供正确的类，正确突出显示错误并使您能够自动修复语法。因此，NetBeans IDE 可帮助您编写与 link:http://docs.oracle.com/javase/specs/jls/se7/html/index.html[+Java 语言规范 Java SE 7 Edition+] 兼容的代码。

在本教程中，您将了解 IDE 如何处理 Java 7 语言结构。


image::images/netbeans-stamp-80-74.png[title="此页上的内容适用于 NetBeans IDE 7.4 和 8.0"]


*要学完本教程，您需要具备下表所列的软件和资源。*

|===
|软件或资源 |要求的版本 

|link:https://netbeans.org/downloads/index.html[+NetBeans IDE+] |版本 7.4 或 8.0 

|link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+Java 开发工具包 (JDK)+] |版本 7 或 8 
|===


== 确保在 NetBeans IDE 中注册 JDK 7

要检查是否在 NetBeans IDE 中注册了 JDK 7，请执行以下操作：

1. 在 IDE 中，从主菜单中选择 "Tools"（工具）> "Java Platforms"（Java 平台）。
2. 确保在 "Java Platforms Manager"（Java 平台管理器）对话框的 "Platforms"（平台）列表中选定 "JDK 1.7"。

[.feature]
--
image::images/platform-small.png[role="left", link="images/platform.png"]
--

3. 单击 "Close"（关闭）。


== 检查项目配置

要检查您的项目是否配置为使用注册的 JDK 进行编译、运行和调试，请执行以下操作：

1. 通过选择 "File"（文件）> "New Project"（新建项目），然后选择 "Java Application"（Java 应用程序）作为项目类型，来创建 Java 项目。
2. 单击 "Next"（下一步）。
3. 键入  ``SwitchTest``  作为项目名称并指定其位置。
4. 单击 "Finish"（完成）。
5. 在 "Projects"（项目）窗口中，右键单击  ``SwitchTest``  项目节点，然后选择 "Properties"（属性）> "Libraries"（库）。在此标签上，确保在 "Java Platforms"（Java 平台）列表中选定 "JDK 1.7"。

[.feature]
--
image::images/props-libs-small.png[role="left", link="images/props-libs.png"]
--

6. 切换到 "Project Properties"（项目属性）窗口的 "Sources"（源）标签，并确保选择 "JDK 7" 作为源代码/二进制格式。

[.feature]
--
image::images/props-sources-small.png[role="left", link="images/props-sources.png"]
--

7. 单击“确定”。关闭“项目属性”对话框。您的项目配置为识别 Java 7 语言功能。


== 使用新的 JDK 7 语言结构：Switch 语句

JDK 7 在不同领域提供了一些link:http://openjdk.java.net/projects/jdk7/features/[+新增功能和改进功能+]，其中包括国际化、I/O 和网络、安全等。要说明 IDE 的 Java 编辑器提供的 JDK 7 支持，最好的方法是演示 Project Coin 引入的一些语言变化。

其中一个变化是“switch 中的 String”。在早期版本的 Java 中， ``switch``  的参数只能属于以下基本数据类型： ``byte`` 、 ``short`` 、 ``char`` 、 ``int``  或  ``enum`` 。从 JDK 7 开始，您可以在  ``switch``  语句的表达式中使用  ``String``  类型的参数。

1. 打开  ``SwitchTest.java`` ，并添加以下代码。该小样例显示几种颜色的 RGB 代码。
对于 JDK 7， ``color``  变量可以为  ``String`` 。

[source,java]
----

package switchtest;

    public class SwitchTest {

    public static void main(String[] args) {

        String color = "red";
        String colorRGB;
        switch (color.toLowerCase()) {
            case "black": colorRGB = "000000"; break;
            case "red": colorRGB = "ff0000"; break;
            case "green": colorRGB = "008000"; break;
            case "blue": colorRGB = "0000ff"; break;
            default: colorRGB = "Invalid color"; break;
        }
        System.out.println(colorRGB);
        }
    }

----

如果在编辑器中错误地设置了粘贴的代码格式，请按 Alt-Shift-F 组合键以重新设置格式。

2. 在 "Projects"（项目）窗口中，右键单击该项目节点并选择 "Run File"（运行文件）。此时将会看到应用程序输出，这是红色的 RGB 代码。
如果目标平台和源格式为 JDK 7，您可以看到构建成功，并且应用程序正常工作。

image::images/output.png[]

3. 让我们改用以前的 JDK 6，并测试如何使用 JDK 6 编译器编译应用程序。
在 "Projects"（项目）窗口中，右键单击该项目节点并选择 "Properties"（属性）。在 "Sources"（源）类别中，将源代码/二进制格式设置为  ``JDK 6`` ，然后单击 "OK"（确定）。
您可以立即看到 JDK6 解析器无法识别语法。编译将失败，因为变量类型不兼容。

[.feature]
--
image::images/error-small.png[role="left", link="images/error.png"]
--

4. 现在，让我们使用  ``if-then-else``  语句而非  ``switch``  重新编写代码，如下所示：

[source,java]
----

package switchtest;

    public class SwitchTest {

    public static void main(String[] args) {

        String color = "red";
        String colorRGB;
        if (color.equals("black")) {
            colorRGB = "000000";
        } else if (color.equals("red")) {
            colorRGB = "ff0000";
        } else if (color.equals("green")) {
            colorRGB = "008000";
        } else if (color.equals("blue")) { 
            colorRGB = "0000ff";
        } else {
            colorRGB = "Invalid color";
        }
        System.out.println(colorRGB);
        }
    }

----
在将 JDK 7 作为源代码/二进制格式的情况下，IDE 将识别这种情况，并允许您将其转换为  ``switch`` ，如下图中所示。

[.feature]
--
image::images/convert-small.png[role="left", link="images/convert.png"]
--

单击该提示， ``if-then-else``  结构将自动转换为  ``switch`` ，这与我们以前使用的 switch 完全相同。


== JDK 7 支持：更多示例

要演示 IDE 的 Java 编辑器如何识别和自动修复代码，以便与 JDK 7 语言规范兼容，让我们使用一个虚拟代码片段，该代码片段本身没有什么意义，但它包含所有主要的语言改进功能。

在逐步完成该虚拟代码片段并应用编辑器提示后，您将看到以下功能的操作方法示例：

* 在 Java 编译器可以推断通用实例类型而无需明确指定该类型时，利用自动类型推断。使用所谓的_菱形运算符_来标记类型推断情况。
* 在可以使用一个  ``catch``  块处理几种类型的异常错误时，使用改进的异常错误处理或 _multi-catch_。 
* 使用自动资源管理功能引入的资源关闭语句的新语法。

1. 将同一  ``SwitchTest.java``  文件中的旧应用程序代码替换为以下代码：

[source,java]
----

package switchtest;


import java.io.FileInputStream;
import java.lang.reflect.Method;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class SwitchTest {

    public void test() throws IOException {
        List<String> list = new ArrayList<String>();
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        HashMap<String, Integer> map2 = new HashMap<String, Integer>();
        String a = "ehlo";

        try {
            Method m = Object.class.getMethod("toString");
            m.invoke(this);
        } catch(NoSuchMethodException e) {
            e.printStackTrace();
        } catch(InvocationTargetException e) {
            e.printStackTrace();
        } catch(IllegalAccessException e) {
            e.printStackTrace();
        }

        FileInputStream in = null;
        try {
            in = new FileInputStream("foo.txt");

            int k;
            while ((k = in.read()) != -1) {
                System.out.write(k);
            }
        } finally {
            if (in != null) {
                in.close();
            }
        }
    }
}
 
----
2. 请注意，IDE 将显示一些说明如何优化代码以符合 JDK 7 规范的提示，如本教程中上面所述。只需单击每个提示并选择建议的操作即可。 
3. 最后，接受了所有建议后，您就应该具有与 JDK 7 兼容的代码，如下所示。

[.feature]
--
image::images/converted-small.png[role="left", link="images/converted.png"]
--

link:/about/contact_form.html?to=3&subject=Feedback: Overview of JDK 7 Support in NetBeans IDE[+发送有关此教程的反馈意见+]



== 另请参见

有关 JDK 7 和 NetBeans IDE 的详细信息，请参见：

* _使用 NetBeans IDE 开发应用程序_中的link:http://www.oracle.com/pls/topic/lookup?ctx=nb7400&id=NBDAG465[+设置目标 JDK+]
* link:http://download.oracle.com/javase/tutorial/essential/io/fileio.html[+Java 教程：文件 I/O+] - Java 教程中的一个部分，其中包含 JDK 7 中的一些 I/O 变化示例。
* link:http://download.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html[+Java 教程：分支和结合+] - 说明了 JDK7 中的新分支/结合框架。

有关在 NetBeans IDE 中开发 Java 应用程序的详细信息，请参见：

* link:javase-intro.html[+开发常规 Java 应用程序+]
* link:../../trails/java-se.html[+常规 Java 开发学习资源+]
* _使用 NetBeans IDE 开发应用程序_中的link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG366[+创建 Java 项目+]
